2010-03-23 16 views

Respuesta

7

Observe los atributos del método y vea si el método está decorado con CompilerGeneratedAttribute.

Los métodos anónimos (así como otros objetos, como las propiedades implementadas automáticamente, etc.) tendrán este atributo agregado.


Por ejemplo, supongamos que tiene un tipo para su clase. Los métodos anónimos estarán en:

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

Esto debería devolver cualquiera de los métodos anónimos definidos en MyClass.

+0

Y también cualquier otro método (o miembro/tipo). – leppie

+0

Es cierto: puede definir esto manualmente en cualquier método y engañarlo, pero normalmente se usa para métodos anónimos y otra información generada por el compilador. –

+0

Para propiedades automáticas también, y en getters y setters de propiedades. – leppie

4

Por lo que puedo ver, que el patrón de expresión regular sería:

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

No se puede, porque no hay tal cosa como un método anónimo en el nivel de IL - todos son nombrados, y todos pertenecen a tipos nombrados Y la forma en que los compiladores C# y VB traducen los métodos anónimos a métodos y tipos específicos está completamente definida por la implementación y no se puede confiar (lo que significa que, por ejemplo, puede cambiar con cualquier actualización, incluso en revisiones/revisiones menores).

+3

+1: Esta es, técnicamente, la respuesta "correcta", pero [CompilerGenerated] funciona con bastante fiabilidad en la práctica. –

Cuestiones relacionadas