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

时间:2015-09-01 06:44:29

标签: c# reflection unity-container bindingflags

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

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

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

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

2 个答案:

答案 0 :(得分:7)

使用自定义属性:

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; }
}

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

function Outer() {
  var bigGuy = createSomethingHuge();
  var tinyNumber = 42;
  return (function () { /* CONTENTS */ });
}

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

答案 1 :(得分:2)

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

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