创建允许使用多个的MetadataAttribute
。
[MetadataAttribute]
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class BusinessLogicMetaDataAttribute : ExportAttribute, IBusinessLogicMetaData
{
//......
}
然后我使用GetExports<T>()
导入方法。
//.....
var imported = _container.GetExports<Action<object, EvantArgs>, IBusinessLogicMetaData>("myplugin");
//.....
这是我的插件方法:
[BusinessLogicMetaData("myplugin")]
[BusinessLogicMetaData("myplugin1")]
public void Test(object sender, EventArgs e)
{
//....
}
由于AlowMultiple=true
中的MetadataAttribute
,导致导出未返回插件方法。如果我将metadataAttribute设置为AllowMultiple = false并删除插件方法的第二个属性,它可以正常工作。
为什么我的插件方法不能有两个属性?
感谢您的帮助!
答案 0 :(得分:2)
不确定它是否适合您的特定情况,因为我不了解您的整个设计和最终目标,但由于您正在创建元属性等,您可以将flag enum (see Enumeration Types as Bit Flags)包裹在您的BusinessLogicMetaDataAttribute
,也就是说,不是使用字符串,而是使用标志枚举,那么你可以像下面这样做
[BusinessLogicMetaData(MyFlagEnum.myplugin | MyFlagEnum.myplugin1)]
public void Test(object sender, EventArgs e)
{
//....
}
更新:要在不使用标记枚举的情况下执行多次导出,请从Attribute
继承而不是 ExportAttribute ,有关网络上此问题的一些讨论
[MetadataAttribute]
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class BusinessLogicMetaDataAttribute : Attribute, IBusinessLogicMetaData
{
//......
}
答案 1 :(得分:0)
我正在回答我自己的问题。我决定在MetaDataAttribute上有两个构造函数。
1)采用一个字符串参数
2)取一个string []参数
然后我可以这样做:
[BusinessLogicMetaData(new string[]{"myplugin1", "myplugin2"})]
public void Test(object sender, EventArgs e)
{
//....
}