使用自定义属性:
[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。