1

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

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

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

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

4

2 回答 2

7

使用自定义属性:

[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

于 2015-09-01T06:47:45.623 回答
2

您可以使用以下代码。它将返回公共和非公共方法。

MethodInfo[] methodInfos =  myObject.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly);
于 2015-09-01T07:01:46.270 回答