Как получить пользовательский список методов с отражением в 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);
Другие вопросы по тегам