68 Stimmen

Methoden mit benutzerdefinierten Attributen über Reflexion finden

Ich habe ein benutzerdefiniertes Attribut:

public class MenuItemAttribute : Attribute
{
}

und eine Klasse mit ein paar Methoden:

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

    [MenuItemAttribute]
    public void Cry()
    {
    }

    public void RunLikeHell()
    {
    }
}

Wie kann ich nur die Methoden erhalten, die mit dem benutzerdefinierten Attribut dekoriert sind?

Bis jetzt habe ich das:

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();
         }
     }
}

Was ich jetzt brauche, ist der Name der Methode, der Rückgabetyp und die Parameter, die sie akzeptiert.

116voto

SLaks Punkte 832502

Ihr Code ist völlig falsch.
Sie schleifen durch alle Typ die das Attribut hat, das keine Typen findet.

Sie müssen jede Methode jedes Typs in einer Schleife durchlaufen und prüfen, ob sie Ihr Attribut hat.

Zum Beispiel:

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

25voto

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

6voto

Unknown Artist Punkte 103
var classType = new ClassNAME();
var methods = classType.GetType().GetMethods().Where(m=>m.GetCustomAttributes(typeof(MyAttribute), false).Length > 0)
.ToArray();

Jetzt haben Sie alle Methoden mit diesem Attribut MyAttribute im Unterricht classNAME . Sie können sie überall aufrufen.

public class ClassNAME
{
    [MyAttribute]
    public void Method1(){}

    [MyAttribute]
    public void Method2(){}

    public void Method3(){}
}

class MyAttribute: Attribute { }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X