Найти методы, которые имеют настраиваемый атрибут с использованием отражения
У меня есть пользовательский атрибут:
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();
}
}
}
Теперь мне нужно получить имя метода, тип возврата, а также параметры, которые он принимает.
Ответы
Ответ 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(){}
}