2017-10-07 109 views
2

我認爲幕後的ImportAttributeImportManyAttribute應該使用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。謝謝你的幫助!

回答

1

確實有一種方法!不需要導入另一個班級的出口。只需使用GetExport < T,TMetadataView>方法。基於您的代碼我把它僅僅通過增加工作:

var wow = c.GetExport<A, IMetadata>(); 

這將返回只是你想要的,一個懶惰< T,TMetadataView>

希望這有助於!

+0

好吧,它有點隱藏,它真的有幫助,謝謝。我關心的問題已經很遙遠,因爲我現在已經參與其他問題,我還沒有測試過,但我相信它應該工作! – Hopeless

相關問題