1

创建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 并删除插件方法的第二个属性,它工作正常。

为什么我的插件方法不能有两个属性?

谢谢您的帮助!

4

2 回答 2

2

不确定它是否适用于您的特定情况,因为我不知道您的整个设计和最终目标,但由于您正在创建元属性等,您可以包装一个标志枚举(请参阅枚举类型作为位标志)在你的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
{
     //......
}
于 2013-07-23T18:34:06.470 回答
0

我正在回答我自己的问题。我决定在我的 MetaDataAttribute 上有两个构造函数。

1) 采用一个字符串参数

2) 接受一个 string[] 参数

然后我可以这样做:

[BusinessLogicMetaData(new string[]{"myplugin1", "myplugin2"})]
public void Test(object sender, EventArgs e)
{
    //....
}
于 2013-08-14T18:43:25.430 回答