如何在C#中使用反射自定义方法列表

Emi*_*ano 1 c# reflection unity-container bindingflags

我正在使用反射来创建用户将在动态生成的菜单中使用的方法列表(我是统一的).我在用:

MethodInfo[] methodInfos =  myObject.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
Run Code Online (Sandbox Code Playgroud)

但并不是所有类的公共方法都应该出现在这个菜单中,所以我想知道,是否有一些标志可以用来标记我需要的方法?

然后使用这个"自定义标志"来通过反射来获取这些方法.谢谢 :).

Den*_*nis 7

使用自定义属性:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
public class MenuItemAttribute : Attribute
{
}
Run Code Online (Sandbox Code Playgroud)

并允许用户标记方法:

public class Foo
{
    [MenuItem]
    public void Bar() {}
}
Run Code Online (Sandbox Code Playgroud)

然后,在方法查找上,检查此属性的元数据:

var methodInfos = myObject
    .GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly)
    .Where(_ => _.IsDefined(typeof(MenuItemAttribute)));
Run Code Online (Sandbox Code Playgroud)

如果您需要为用户提供定义菜单路径的功能,请使用自定义参数扩展属性,如下所示:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
public class MenuItemAttribute : Attribute
{
    public MenuItemAttribute(string menuPath)
    {
        MenuPath = menuPath;
    }

    public string MenuPath { get; }
}
Run Code Online (Sandbox Code Playgroud)

另一种选择是抛弃自定义方式制作插件,并使用开箱即用的东西,例如MEF.