2010-08-12 10 views
38

Ich habe ein benutzerdefiniertes Attribut:Methoden finden, die benutzerdefinierte Attribut mit Reflexion

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 verziert werden das benutzerdefinierte Attribut?

Bisher habe ich dies:

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 brauchen, ist die Methode Namen zu erhalten, den Rückgabetyp, sowie die Parameter sie akzeptiert.

Antwort

68

Ihr Code ist völlig falsch.
Sie durchlaufen alle Typ, die das Attribut hat, die keine Typen finden wird.

Sie müssen jede Methode für jeden Typ 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(); 
+0

tue ich es ass-about-Front hier? Ursache jetzt suche ich nach allen Attributen und ich versuche dann und die zugehörige Methode –

+0

genug mit meinem Code ich bekomme 2 Ergebnisse, aber mit Ihrem Beispiel bekomme ich 0 ..... –

+0

Ich versuchte es mit Ihren Klassen; Für mich geht das. Suchen Sie die richtige Baugruppe? – SLaks

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