代码之家  ›  专栏  ›  技术社区  ›  stoic Kobus Kleynhans

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

  •  43
  • stoic Kobus Kleynhans  · 技术社区  · 16 年前

    我有一个自定义属性:

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

    2 回复  |  直到 10 年前
        1
  •  100
  •   SLaks    16 年前

    你的代码完全错了。
    你在每一个 具有属性的,该属性将找不到任何类型。

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

    例如:

    var methods = assembly.GetTypes()
                          .SelectMany(t => t.GetMethods())
                          .Where(m => m.GetCustomAttributes(typeof(MenuItemAttribute), false).Length > 0)
                          .ToArray();
    
        2
  •  22
  •   JordanBean    13 年前
    Dictionary<string, MethodInfo> methods = assembly
        .GetTypes()
        .SelectMany(x => x.GetMethods())
        .Where(y => y.GetCustomAttributes().OfType<MethodAttribute>().Any())
        .ToDictionary(z => z.Name);
    
        3
  •  2
  •   John Cummings    6 年前
    var classType = new ClassNAME();
    var methods = classType.GetType().GetMethods().Where(m=>m.GetCustomAttributes(typeof(MyAttribute), false).Length > 0)
    .ToArray();
    

    现在您拥有了所有具有此属性的方法 MyAttribute 在课堂上 classNAME

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