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

时间:2013-07-23 18:21:16

标签: c# plugins mef

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

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

感谢您的帮助!

2 个答案:

答案 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)
{
    //....
}
相关问题