我一直在使用反射来创建用户在动态生成的菜单中使用的方法列表(我在团结中)。我正在使用:
MethodInfo[] methodInfos = myObject.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
但是并不是所有类的公共方法都应该出现在这个菜单中,所以我想知道,是否有一些标志可以用来标记我需要的方法?
然后使用这个"自定义标志"通过反思来获得这些方法。谢谢:)。
答案 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);