Найти методы, которые имеют настраиваемый атрибут с использованием отражения
У меня есть пользовательский атрибут:
public class MenuItemAttribute : Attribute { }
и class с несколькими методами:
public class HelloWorld { [MenuItemAttribute] public void Shout() { } [MenuItemAttribute] public void Cry() { } public void RunLikeHell() { } }
Как я могу получить только те методы, которые украшены пользовательским атрибутом?
- Отключить reflection Java для текущего streamа
- Отражение. Получение общих параметров из экземпляра System.Type.
- Получение типа classа из строки
- Получить имя и тип свойства, используя выражение lambda
- Field.get (obj) возвращает все значения NULL для инъецированных управляемых бинов CDI, тогда как ручные вызовы getters возвращают правильные значения
Пока у меня есть это:
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(); } } }
Теперь мне нужно получить имя метода, тип возврата, а также параметры, которые он принимает.
- Получить тип общего параметра в Java с reflectionм
- Как ограничить setAccessible только «законным» использованием?
- Насколько дорого стоит .NET-reflection?
- Как получить список свойств с заданным атрибутом?
- C # Reflection: Как получить ссылку на class из строки?
- Вызов статического метода с reflectionм
- Вызов методов с необязательными параметрами посредством отражения
- Вызов универсального метода с аргументом типа, известным только во время выполнения
Ваш код полностью ошибочен.
Вы перебираете все типы , у которых есть атрибут, который не найдет никаких типов.
Вам нужно прокручивать каждый метод на каждом типе и проверять, имеет ли он свой атрибут.
Например:
var methods = assembly.GetTypes() .SelectMany(t => t.GetMethods()) .Where(m => m.GetCustomAttributes(typeof(MenuItemAttribute), false).Length > 0) .ToArray();
Dictionary methods = assembly .GetTypes() .SelectMany(x => x.GetMethods()) .Where(y => y.GetCustomAttributes().OfType().Any()) .ToDictionary(z => z.Name);