Как получить пользовательский список методов с отражением в C#
Я использую отражение, чтобы создать список методов, которые пользователь будет использовать в динамически генерируемом меню (я в единстве). Я использую:
MethodInfo[] methodInfos = myObject.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
Но не все общедоступные методы класса должны появляться в этом меню, поэтому мне было интересно, есть ли какой-нибудь флаг, который я мог бы использовать для пометки только тех методов, которые мне нужны?
А затем используйте этот "пользовательский флаг", чтобы получить эти методы через отражение. Спасибо:).
2 ответа
Использовать пользовательский атрибут:
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
public class MenuItemAttribute : Attribute
{
}
и позволить пользователю отмечать методы:
public class Foo
{
[MenuItem]
public void Bar() {}
}
Затем, при поиске методов, проверьте метаданные для этого атрибута:
var methodInfos = myObject
.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly)
.Where(_ => _.IsDefined(typeof(MenuItemAttribute)));
Если вам нужно предоставить возможность пользователю определять путь по меню, то добавьте в свой атрибут пользовательский параметр, например, так:
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
public class MenuItemAttribute : Attribute
{
public MenuItemAttribute(string menuPath)
{
MenuPath = menuPath;
}
public string MenuPath { get; }
}
Другой вариант - отказаться от нестандартного способа создания плагинов и использовать что-то из коробки, например, MEF.
Вы могли бы использовать приведенный ниже код. Он возвращает как публичные, так и не публичные методы.
MethodInfo[] methodInfos = myObject.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly);