Как определить анонимные методы в System.Reflection - PullRequest
7 голосов
/ 23 марта 2010

Как вы можете определить анонимные методы с помощью рефлексии?

Ответы [ 3 ]

8 голосов
/ 23 марта 2010

Вы не можете, потому что на уровне IL не существует такого понятия, как анонимный метод - все они именуются и все принадлежат именованным типам. И способ, которым компиляторы C # и VB переводят анонимные методы в именованные методы и типы, полностью определяется реализацией и на него нельзя положиться (это означает, что, например, он может изменяться при любом обновлении, даже в небольших выпусках / исправлениях).

8 голосов
/ 23 марта 2010

Посмотрите на атрибуты метода и посмотрите, украшен ли метод CompilerGeneratedAttribute .

Анонимные методы (а также другие объекты, такие как автоматически реализуемые свойства и т. Д.).) будет добавлен этот атрибут.


Например, предположим, что у вас есть тип для вашего класса.Анонимные методы будут в:

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

Это должно вернуть любые анонимные методы, определенные в MyClass.

5 голосов
/ 23 марта 2010

Из того, что я вижу, этот шаблон регулярного выражения будет:

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