Emi*_*ano 1 c# reflection unity-container bindingflags
我正在使用反射来创建用户将在动态生成的菜单中使用的方法列表(我是统一的).我在用:
MethodInfo[] methodInfos = myObject.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
Run Code Online (Sandbox Code Playgroud)
但并不是所有类的公共方法都应该出现在这个菜单中,所以我想知道,是否有一些标志可以用来标记我需要的方法?
然后使用这个"自定义标志"来通过反射来获取这些方法.谢谢 :).
使用自定义属性:
[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.