Использование отражения, чтобы проверить, является ли метод «Метод расширения» - PullRequest
16 голосов
/ 06 апреля 2009

Как часть моего приложения, у меня есть функция, которая получает MethodInfo и должна выполнять определенные операции над ним в зависимости от того, является ли этот метод «Метод расширения».

Я проверил класс MethodInfo и не смог найти ни одного IsExtension свойства или флага, который показывает, что метод является расширением.

Кто-нибудь знает, как я могу найти это из MethodInfo метода?

Ответы [ 5 ]

22 голосов
/ 06 апреля 2009

Вы можете вызвать метод IsDefined в экземпляре MethodInfo, чтобы выяснить это, проверив, применяется ли ExtensionAttribute к методу:

bool isExtension=someMethod.IsDefined(typeof(ExtensionAttribute),true);
18 голосов
/ 06 апреля 2009

На основании

F # методы расширения в C #

похоже, что в скомпилированной форме есть атрибут. Посмотрите, есть ли у метода этот атрибут:

http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.extensionattribute.aspx

3 голосов
/ 06 апреля 2009

Это выглядит очень похоже на более ранний вопрос , возможно, стоит посмотреть. Было предложено искать классы и методы с ExtensionAttribute , который звучит как то, что вы ищете.

1 голос
/ 06 апреля 2009

Если вы знаете, что получаете MethodInfo от экземпляра, вы можете легко проверить, является ли метод статическим. Методы расширения являются просто синтаксическим сахаром и преобразуются в вызовы статических методов, передаваемых в экземпляре.

0 голосов
/ 06 апреля 2009

Разве компилятор не переключает все методы расширения в вызовы статических методов во время компиляции?

myList.First();

становится

Enumerable.First(myList);

Если это так, то в среде выполнения .net (где вы задумываетесь) нет методов расширения.

...