2009-09-15 13 views
5

Questo è correlato alla domanda su return type attributes e anonymous classes, ma poi per metodi anonimi (o lambda), ma fino ad ora ho potuto trovare questa domanda esatta non sembra essere ancora su StackOverflow.Sintassi per applicare un attributo ad un metodo anonimo?

Nel codice per le entità aziendali che generiamo utilizzando CodeSmith ora abbiamo gli attributi [DebuggerNonUserCode], quindi non contano i risultati di copertura del codice. Sfortunatamente, il codice generato utilizza metodi anonimi che ora appaiono ancora nella copertura del codice con nomi come Class.<>c__DisplayClass3c a causa del modo in cui questi sono effettivamente gestiti dal compilatore.

esempio di codice rapido, con nomi e tipi cambiato per proteggere gli innocenti, per così dire:

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"; 
     }); 
    } 

C'è un modo per ottenere [DebuggerNonUserCode] attributi su questi metodi in modo che potessimo sbarazzarci del nome-mutilato nomi di metodi anonimi dal nostro codice generato dai nostri risultati di copertura del codice? O dobbiamo riscrivere quel codice generato per non usare più metodi anonimi?

Mettere il [DebuggerNonUserCode] sul parametro method della definizione SafeCall metodo (prima del tipo ReturnSomething<T> parametri) non compilare e forse non avrebbe fatto esattamente ciò che vorremmo se sarebbe. Di seguito, inoltre, non compilare:

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

ho cercato di avere un rapido sguardo alla CSharp Language Specification, ma non hanno avuto fortuna a trovare una sintassi che consentirebbe l'applicazione di attributi per i metodi anonimi (o lambda) . Mi è mancato, o è questo (al momento?) Impossibile ...?

+0

Non credo che questo otterrà la massima priorità (se mai verrà eseguita), ma ho aggiunto il suggerimento a MS Connect all'indirizzo https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID = 489925 – peSHIr

risposta

9

Purtroppo non si può. E 'quotata a pagina 401 delle specifiche C# 3.0 lingua:

attributi possono essere specificati al ambito globale (per specificare gli attributi sul contenenti montaggio o modulo) e per tipo-dichiarazioni (§9.6) , dichiarazioni membro di classe (§10.1.5), dichiarazioni membro di interfaccia (§13.2), struct-member-declaration (§11.2), enum-member-dichiarazioni (§14.3), accessor- dichiarazioni (§10.7.2), dichiarazioni di accesso agli eventi (§10.8.1), e liste di parametri formali (§10.6.1).

+0

Grazie, questo è il riferimento che stavo cercando. :-( – peSHIr

1

Sfortunatamente C# non consente l'applicazione di attributi ai metodi anonimi.

Sei sicuro di voler davvero applicare un attributo DebuggerNonUserCode a questo metodo anonimo? Il metodo è il codice utente e penso che vorreste essere in grado di intervenire se necessario.

+0

Come ho già detto, il metodo SafeCall viene anche chiamato nel codice generato da CodeSmith. Ci piacerebbe mettere un '[DebuggerNonUserCode]' sul metodo anonimo, sì. – peSHIr

Problemi correlati