2010-08-12 8 views
38

J'ai un attribut personnalisé:Trouvez des méthodes qui ont attribut personnalisé à l'aide de la réflexion

public class MenuItemAttribute : Attribute 
{ 
} 

et une classe avec quelques méthodes:

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

    [MenuItemAttribute] 
    public void Cry() 
    { 
    } 

    public void RunLikeHell() 
    { 
    } 
} 

Comment puis-je obtenir que les méthodes qui sont décorées avec l'attribut personnalisé?

Jusqu'à présent, j'ai ceci:

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

Ce que je dois maintenant pour obtenir le nom de la méthode, le type de retour, ainsi que les paramètres qu'il accepte.

Répondre

68

Votre code est complètement faux.
Vous parcourez chaque type qui a l'attribut, qui ne trouve aucun type.

Vous devez parcourir chaque méthode sur chaque type et vérifier si elle possède votre attribut.

Par exemple:

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

je le fais cul-volte-face ici? cause maintenant je cherche tous les attributs et je puis essayer et obtenir la méthode associée –

+0

assez étrangement avec mon code, je reçois 2 résultats, mais avec votre exemple, je reçois 0 ..... –

+0

Je l'ai essayé avec vos classes; ça marche pour moi. Cherchez-vous le bon assemblage? – SLaks

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