Utilizzo della riflessione per verificare se un metodo è "Metodo di estensione"
-
05-09-2019 - |
Domanda
Come parte della mia applicazione ho una funzione che riceve un MethodInfo e devo eseguire operazioni specifiche su di esso a seconda che il metodo sia "Metodo di estensione".
Ho controllato la classe MethodInfo e non sono riuscito a trovarne alcuna IsExtension proprietà o flag che mostra che il metodo è un'estensione.
Qualcuno sa come posso trovarlo dal MethodInfo del metodo?
Soluzione
In base a
F metodi # di estensione in C #
sembra che ci sia un attributo sul modulo compilato. Quindi, vedere se il metodo ha questo attributo:
http://msdn.microsoft.com /en-us/library/system.runtime.compilerservices.extensionattribute.aspx
Altri suggerimenti
È possibile chiamare il TestDefinito metodo nell'istanza MethodInfo per trovare questo fuori dal controllo per vedere se la ExtensionAttribute viene applicato al metodo:
bool isExtension=someMethod.IsDefined(typeof(ExtensionAttribute),true);
Questo è molto simile a un precedente domanda , potrebbe essere la pena di Guarda. Il suggerimento non è stato a guardare per le classi e metodi con lo che ExtensionAttribute suona come quello che si sta dopo.
Se si sa che si stanno ottenendo un MethodInfo
da un'istanza, si può facilmente verificare se il metodo è statico. metodi di estensione sono solo zucchero sintattico e ottenere trasformato in chiamate di metodo statico che passano nell'istanza.
Il compilatore non trasforma tutti i metodi di estensione in chiamate di metodi statici in fase di compilazione?
myList.First();
diventa
Enumerable.First(myList);
Se questo è il caso, non ci sono metodi di estensione nel runtime .net (su cui stai riflettendo).