2013-07-23 33 views
1

创建MetadataAttribute属性的方法。MEF不导入具有允许使用多个的多个

[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) 
{ 
    //.... 
} 

获取出口是不是在我MetadataAttribute返回因为AlowMultiple=true插件方法。它工作正常,如果我将我的metadataAttribute设置为AllowMultiple = false并删除插件方法的第二个属性。

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

感谢您的帮助!

回答

0

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

1)接受一个字符串参数

2)采用一个串[]参数

然后,我可以这样做:

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

不知道它是否会为您的特定情况下工作,因为我不知道你的整个设计和最终目标,但因为你是这样创造元和ATTRIB,你可以在你的BusinessLogicMetaDataAttribute紧裹flag enum (see Enumeration Types as Bit Flags),即是,而不是使用字符串,用一个标志枚举,那么你可以做类似下面

[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 
{ 
    //...... 
} 
+0

我不能使用枚举。它可以通过属性名称进行更改。那么有两个属性有什么问题? – Dilshod

+0

@Dshshod查看更新,尝试从'Attribute'继承而不是 – Jason

+0

@Dilshod请注意,您将不得不使用ExportAttribute以及pure(无导出)元数据属性。 –