使用反射查找具有自定义属性的方法

时间:2010-08-12 12:46:37

标签: c# reflection custom-attributes

我有自定义属性:

public class MenuItemAttribute : Attribute
{
}

和一个有几个方法的课程:

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

    [MenuItemAttribute]
    public void Cry()
    {
    }

    public void RunLikeHell()
    {
    }
}

如何只获取使用自定义属性修饰的方法?

到目前为止,我有这个:

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

我现在需要的是获取方法名称,返回类型以及它接受的参数。

3 个答案:

答案 0 :(得分:80)

您的代码完全错误。
您循环遍历具有该属性的每个类型,该属性将找不到任何类型。

您需要遍历每种类型的每个方法,并检查它是否具有您的属性。

例如:

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

答案 1 :(得分:21)

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

答案 2 :(得分:0)

var class = new 'ClassNAME'();
var methods = class.GetType().GetMethods().Where(m=>m.GetCustomAttributes(typeof(MyAttribute), false).Length > 0)
.ToArray();

现在,您在类中具有此属性'MyAttibute'的所有方法。您可以在任何地方调用它。

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

     [MyAttribute]
     public string Method2(){}

     public string Method3(){}
  }