Tengo un atributo personalizado:

public class MenuItemAttribute : Attribute
{
}

y una clase con un par de 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 este:

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 el nombre del método, el tipo de devolución, así como los parámetros que acepta.

InformationsquelleAutor stoic | 2010-08-12

3 Comentarios

  1. 81

    Su código es completamente erróneo.

    Bucle a través de todos los tipo que tiene el atributo, que no van a encontrar ningún tipo.

    Necesita un bucle a través de cada método en cada tipo y compruebe si tiene el atributo.

    Por ejemplo:

    var methods = assembly.GetTypes()
                          .SelectMany(t => t.GetMethods())
                          .Where(m => m.GetCustomAttributes(typeof(MenuItemAttribute), false).Length > 0)
                          .ToArray();
    • estoy haciendo el culo sobre la frente de aquí? causa ahora miro para todos los atributos y yo y luego tratar de obtener el método asociado
    • strangly suficiente con mi código me sale 2 resultados, pero con su ejemplo puedo obtener 0…..
    • He probado con sus clases; a mí me funciona. Estás buscando el derecho de la asamblea?
    • doh… modificado el código para que sea más sencillo para stackoverflow lectores… nunca cambió de nuevo… gracias… la tuya es la correcta
    • devuelve un array de todos modos, así que .Any() no ayuda.
    • el uso de la Asamblea.GetExecutingAssembly() para el que se está ejecutando actualmente asamblea

  2. 21
    Dictionary<string, MethodInfo> methods = assembly
        .GetTypes()
        .SelectMany(x => x.GetMethods())
        .Where(y => y.GetCustomAttributes().OfType<MethodAttribute>().Any())
        .ToDictionary(z => z.Name);
  3. 0
    var class = new 'ClassNAME'();
    var methods = class.GetType().GetMethods().Where(m=>m.GetCustomAttributes(typeof(MyAttribute), false).Length > 0)
    .ToArray();

    Ahora tienes todos los métodos con este atributo ‘MyAttibute’ de la clase. Puede invocar en cualquier lugar.

    public class 'ClassNAME': IDisposable
     {
         [MyAttribute]
         public string Method1(){}
    
         [MyAttribute]
         public string Method2(){}
    
         public string Method3(){}
      }

Dejar respuesta

Please enter your comment!
Please enter your name here