2009-09-15 13 views
5

Esto se relaciona con la pregunta sobre return type attributes y anonymous classes, pero luego para los métodos anónimos (o lambdas), pero en la medida en que pude encontrar esta pregunta exacta no parece estar todavía en stackoverflow.Sintaxis para aplicar un atributo a un método anónimo

En el código para las entidades comerciales que generamos utilizando CodeSmith ahora tenemos [DebuggerNonUserCode] atributos, por lo que no cuentan en los resultados de la cobertura de código. Desafortunadamente, el código generado utiliza métodos anónimos que ahora todavía aparecen en la cobertura del código con nombres como Class.<>c__DisplayClass3c debido a la forma en que el compilador los maneja.

ejemplo de código rápido, con nombres y tipos cambiados para proteger a los inocentes, por así decirlo:

public delegate T ReturnSomething<T>(); 

    public static T SafeCall<T>(T whenNotSupported, ReturnSomething<T> method) 
    { 
     T result; 
     try 
     { 
      result = method(); 
     } 
     catch (NotSupportedException) 
     { 
      result = whenNotSupported; 
     } 
     return result; 
    } 

    public static void CodeExample() 
    { 
     string foo = SafeCall<string>("OOPS!", delegate 
     { 
      //throw new NotSupportedException(); 
      return "Ok"; 
     }); 
    } 

¿Hay una manera de conseguir [DebuggerNonUserCode] atributos de estos métodos para que pudiéramos deshacernos del nombre-mutilado nombres de métodos anónimos de nuestro código generado a partir de nuestros resultados de cobertura de códigos? ¿O es necesario que reescribamos el código generado para dejar de utilizar métodos anónimos?

Poner el [DebuggerNonUserCode] en el parámetro de la definición methodSafeCall método (antes del tipo de parámetro ReturnSomething<T>) no se compila y tal vez no haría exactamente lo que nos gustaría si lo haría. Lo siguiente también no se compila:

public static void CodeExample() 
    { 
     string foo = SafeCall<string>("OOPS!", [DebuggerNonUserCode] delegate 
     { 
      //throw new NotSupportedException(); 
      return "Ok"; 
     }); 
    } 

He tratado de tener un rápido vistazo a la especificación del lenguaje CSharp, pero no han tenido suerte de encontrar una sintaxis que permitiría aplicar atributos a los métodos anónimos (o lambda) . ¿Lo extrañé, o es esto (¿actualmente?) Imposible ...?

+0

no creo que esto obtendrá alta prioridad (si alguna vez se hace), pero he agregado la sugerencia a MS Connect en https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID = 489925 – peSHIr

Respuesta

9

No se puede, por desgracia. Se enumera en la página 401 de la especificación C# 3.0 idioma:

Los atributos pueden ser especificados en ámbito global (para especificar atributos de la montaje o módulo que contiene) y para tipo-declaraciones (§9.6) , class-member-declarations (§10.1.5), interface-member-declarations (§13.2), struct-member-declarations (§11.2), enum-member-declarations (§14.3), accessor- declaraciones (§10.7.2), declaraciones de acceso a eventos (§10.8.1), y listas de parámetros formales (§10.6.1).

+0

Gracias, esa es la referencia que estaba buscando. :-( – peSHIr

1

Desafortunadamente C# no permite que los atributos se apliquen a métodos anónimos.

¿Está seguro de que realmente desea aplicar un atributo DebuggerNonUserCode a este método anónimo? El método es código de usuario y creo que le gustaría poder entrar en él si es necesario.

+0

Como dije, el método de SafeCall también se llama en código generado por CodeSmith. Ahí nos gustaría poner un '[DebuggerNonUserCode]' en el método anónimo, sí. – peSHIr

Cuestiones relacionadas