2010-03-23 13 views

risposta

7

Osservare gli attributi del metodo e vedere se il metodo è decorato con CompilerGeneratedAttribute.

I metodi anonimi (così come altri oggetti, come le proprietà autoattive, ecc.) Avranno aggiunto questo attributo.


Ad esempio, supponiamo di avere un tipo per la classe. I metodi anonimi saranno in:

Type myClassType = typeof(MyClass); 
IEnumerable<MethodInfo> anonymousMethods = myClassType 
    .GetMethods(
      BindingFlags.NonPublic 
     | BindingFlags.Public 
     | BindingFlags.Instance 
     | BindingFlags.Static) 
    .Where(method => 
      method.GetCustomAttributes(typeof(CompilerGeneratedAttribute)).Any()); 

Ciò dovrebbe restituire tutti i metodi anonimi definiti su MyClass.

+0

E così può qualsiasi altro metodo (o membro/tipo). – leppie

+0

Vero: è possibile definirlo manualmente su qualsiasi metodo e ingannarlo, ma in genere viene utilizzato per metodi anonimi e altre informazioni generate dal compilatore. –

+0

Anche per le proprietà automatiche e sui getter e setter di proprietà. – leppie

4

Da quello che posso vedere, quel modello Regex sarebbe:

<(\w|_)+>b_.+ 
7

Non è possibile, perché non c'è cosa come un metodo anonimo a livello di IL - sono tutti nomi, e appartengono tutti alla tipi nominati. E il modo in cui i compilatori C# e VB traducono metodi anonimi in metodi e tipi nominati è interamente definito dall'implementazione e non può essere invocato (il che significa che, ad esempio, può cambiare con qualsiasi aggiornamento, anche in versioni minori/hotfix).

+3

+1: Questa è, tecnicamente, la risposta "corretta" - ma [CompilerGenerated] funziona in modo abbastanza affidabile nella pratica. –

Problemi correlati