Come si possono identificare i metodi anonimi tramite la riflessione?Come identificare i metodi anonimi in System.Reflection
risposta
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
.
E così può qualsiasi altro metodo (o membro/tipo). – leppie
Vero: è possibile definirlo manualmente su qualsiasi metodo e ingannarlo, ma in genere viene utilizzato per metodi anonimi e altre informazioni generate dal compilatore. –
Anche per le proprietà automatiche e sui getter e setter di proprietà. – leppie
Da quello che posso vedere, quel modello Regex sarebbe:
<(\w|_)+>b_.+
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).
+1: Questa è, tecnicamente, la risposta "corretta" - ma [CompilerGenerated] funziona in modo abbastanza affidabile nella pratica. –
- 1. Ambito dei metodi anonimi
- 2. BackgroundWorker con metodi anonimi?
- 3. Confusione circa i metodi anonimi Parametri
- 4. Metodi anonimi e delegati
- 5. Equivalente dei metodi anonimi C# in Java?
- 6. VB.NET RemoveHandler e metodi anonimi
- 7. Metodi anonimi rispetto all'espressione lambda
- 8. Utilizzo di MethodInfo.GetCurrentMethod() in metodi anonimi
- 9. È possibile identificare i metodi con alias in Ruby?
- 10. System.Reflection - Metodi globali non disponibili per la riflessione
- 11. Environment.CurrentDirectory vs System.Reflection
- 12. System.Reflection vs Generics - performance
- 13. C'è qualche sovraccarico nell'uso di metodi anonimi?
- 14. Interfacce, metodi anonimi e perdite di memoria
- 15. Come impostare il formattore del codice per i metodi anonimi Java in Eclipse
- 16. Posso serializzare i Tipi anonimi come xml?
- 17. IQueryable per i tipi anonimi
- 18. Differenza tra le espressioni lambda e metodi anonimi - C#
- 19. Come terminare i thread anonimi in Delphi alla chiusura dell'applicazione?
- 20. Come identificare i dispositivi con udev
- 21. File condivisi anonimi tra i ruoli
- 22. Contributi anonimi e contributori anonimi in progetti open source
- 23. Come identificare i thread in Eclipse Debug Prospettiva?
- 24. Come si dichiarano i campi "Chiave" nei tipi anonimi C#?
- 25. Come serializzare oggetti anonimi in XML?
- 26. Come passare i metodi migliori in metodi della stessa classe
- 27. Come chiamare i metodi factory da HTML in angularjs? metodi
- 28. Perché i sindacati anonimi globali devono essere dichiarati come statici?
- 29. Utilizzo di tipi anonimi C#
- 30. C# metodo di inizializzazione in tipi anonimi
Puoi dire qualcosa di più su ciò che vuoi realizzare? –