我認爲幕後的ImportAttribute
或ImportManyAttribute
應該使用MEF的一些核心方法來獲取與導出類型的實際實例配對的導出元數據。使用這些屬性與以下設置正常工作:獲取導出的元數據而不使用MEF中的ImportAttribute或ImportManyAttribute?
//the metadata interface
public interface IMetadata {
string Name {get;}
}
//the custom ExportAttribute
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
[MetadataAttribute]
public class CustomExportAttribute : ExportAttribute, IMetadata {
public string Name {get;set;}
}
//the class which need to be exported (both value and metadata)
[CustomExport(Name = "someName")]
public class A {
}
//the class which imports the exported value and metadata
[Export]
public class B {
[Import]
public Lazy<A, IMetadata> AData {get;set;}
}
現在得到B的出口值的時候,我可以通過IMetadata
接口的A
及其相關元數據正確導出例如瀏覽AData
,就像這樣:
var ac = new AggregateCatalog();
ac.Catalogs.Add(new DirectoryCatalog("."));
var c = new CompositionContainer(ac);
var b = c.GetExportedValue<B>();
var data = b.AData.Value;//some instance of A here
var mdata = b.AData.Metadata;//some metadata of A here
但是我不想在這種情況下使用B
這個類,我怎麼能得到A的實例和它的元數據的導出對呢?因爲沒有使用任何類(如B
),所以在這種情況下也不使用屬性ImportAttribute
。 以下是我已經試過:
var ac = new AggregateCatalog();
ac.Catalogs.Add(new DirectoryCatalog("."));
var c = new CompositionContainer(ac);
var a = c.GetExportedValue<Lazy<A,IMetadata>>();
上面最後一行拋出異常ImportCardinalityMismatchException
,像這樣:
出口沒有發現匹配的約束:ContractName System.Lazy(測試。 A,Test.IMetadata)RequiredTypeIdentity System.Lazy(Test.A,Test.IMetadata)
我相信,必須有某種方式來獲得出口值(對類型實例及其元數據)的情況下直接使用一個虛擬類,其中ImportAttribute
用於存儲該類某些屬性中的導出值。
請幫我解決這個問題,我還在開始使用MEF和Prism。謝謝你的幫助!
好吧,它有點隱藏,它真的有幫助,謝謝。我關心的問題已經很遙遠,因爲我現在已經參與其他問題,我還沒有測試過,但我相信它應該工作! – Hopeless