2013-07-23 32 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(無導出)元數據屬性。 –