Подтвердить что ты не робот

Найти методы, которые имеют настраиваемый атрибут с использованием отражения

У меня есть пользовательский атрибут:

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

Теперь мне нужно получить имя метода, тип возврата, а также параметры, которые он принимает.

4b9b3361

Ответ 1

Ваш код совершенно не прав.
Вы перебираете все типы, у которых есть атрибут, который не найдет никаких типов.

Вам нужно выполнить цикл каждого метода для каждого типа и проверить, имеет ли он свой атрибут.

Например:

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

Ответ 2

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

Ответ 3

var methods = assembly.GetTypes()
    .SelectMany(x => x.GetMethods())
    .Where(m => m.GetCustomAttribute(typeof(MethodAttribute)) != null)

Ответ 4

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