2010-08-12 12 views
38

Tengo un atributo personalizado:Encontrar métodos que tienen atributo personalizado que utilizan la reflexión

public class MenuItemAttribute : Attribute 
{ 
} 

y una clase con unos métodos:

public class HelloWorld 
{ 
    [MenuItemAttribute] 
    public void Shout() 
    { 
    } 

    [MenuItemAttribute] 
    public void Cry() 
    { 
    } 

    public void RunLikeHell() 
    { 
    } 
} 

¿Cómo puedo obtener sólo los métodos que están decoradas con el atributo personalizado?

Hasta ahora, tengo unas pocas cosas:

string assemblyName = fileInfo.FullName; 
byte[] assemblyBytes = File.ReadAllBytes(assemblyName); 
Assembly assembly = Assembly.Load(assemblyBytes); 

foreach (Type type in assembly.GetTypes()) 
{ 
    System.Attribute[] attributes = System.Attribute.GetCustomAttributes(type); 

    foreach (Attribute attribute in attributes) 
    { 
     if (attribute is MenuItemAttribute) 
     { 
      //Get me the method info 
      //MethodInfo[] methods = attribute.GetType().GetMethods(); 
     } 
    } 
} 

Lo que necesito ahora es conseguir que el nombre del método, el tipo de retorno, así como los parámetros que acepta.

Respuesta

68

Su código es completamente incorrecto.
Está recorriendo cada tipo que tiene el atributo, que no encontrará ningún tipo.

Debe recorrer todos los métodos en cada tipo y comprobar si tiene su atributo.

Por ejemplo:

var methods = assembly.GetTypes() 
         .SelectMany(t => t.GetMethods()) 
         .Where(m => m.GetCustomAttributes(typeof(MenuItemAttribute), false).Length > 0) 
         .ToArray(); 
+0

lo estoy haciendo culo-sobre-frontal aquí? porque en este momento busco todos los atributos y luego trato de obtener el método asociado –

+0

de forma estrangulada con mi código obtengo 2 resultados, pero con su ejemplo obtengo 0 ..... –

+0

Lo probé con sus clases; esto funciona para mi. ¿Estás buscando el ensamblaje correcto? – SLaks

19
Dictionary<string, MethodInfo> methods = assembly 
    .GetTypes() 
    .SelectMany(x => x.GetMethods()) 
    .Where(y => y.GetCustomAttributes().OfType<MethodAttribute>().Any()) 
    .ToDictionary(z => z.Name); 
Cuestiones relacionadas