MEF不导入具有允许多个的属性的方法

本文关键字:许多个 属性 方法 导入 MEF | 更新日期: 2023-09-27 18:24:24

创建了允许使用多个的MetadataAttribute

[MetadataAttribute]
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class BusinessLogicMetaDataAttribute : ExportAttribute, IBusinessLogicMetaData
{
     //......
}

那么我使用CCD_ 2来导入方法。

//.....
var imported = _container.GetExports<Action<object, EvantArgs>, IBusinessLogicMetaData>("myplugin");
//.....

这是我的插件方法:

[BusinessLogicMetaData("myplugin")]
[BusinessLogicMetaData("myplugin1")]
public void Test(object sender, EventArgs e)
{
    //....
}

Get-exports没有返回插件方法,因为我的MetadataAttribute中有AlowMultiple=true。如果我将metadataAttribute设置为AllowMultiple=false,并删除插件方法的第二个属性,效果会很好。

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

谢谢你的帮助!

MEF不导入具有允许多个的属性的方法

不确定它是否适用于您的特定情况,因为我不知道您的整个设计和最终目标,但由于您正在创建一个元属性等等,您可以在BusinessLogicMetaDataAttribute中包装一个标志枚举(请参阅枚举类型为位标志),也就是说,不使用字符串,而是使用标志枚举,然后您可以像下面的一样

[BusinessLogicMetaData(MyFlagEnum.myplugin | MyFlagEnum.myplugin1)]
public void Test(object sender, EventArgs e)
{
    //....
}

更新:要在不使用标志枚举的情况下进行多个导出,请从Attribute继承,而不是从ExportAttribute继承,围绕web 有一些关于此问题的讨论

[MetadataAttribute]
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class BusinessLogicMetaDataAttribute : Attribute, IBusinessLogicMetaData
{
     //......
}

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

1) 取一个字符串参数

2) 取一个字符串[]参数

然后我可以这样做:

[BusinessLogicMetaData(new string[]{"myplugin1", "myplugin2"})]
public void Test(object sender, EventArgs e)
{
    //....
}