如何在c#中获得自定义的反射方法列表

本文关键字:自定义 反射 方法 列表 | 更新日期: 2023-09-27 18:10:48

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

MethodInfo[] methodInfos =  myObject.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);

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

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

如何在c#中获得自定义的反射方法列表

使用自定义属性:

[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);