2017-10-07 3 views
2

私は舞台裏でImportAttributeまたはImportManyAttributeがエクスポートタイプの実際のインスタンスとペアにエクスポートしたメタデータを取得するために、MEFのいくつかのコアメソッドを使用する必要があると考えています。 Bのエクスポートされた値を取得するとき、私はこのように、IMetadataインタフェースを介してAとそれに関連するメタデータの正しくエクスポートインスタンスとADataを閲覧することができます今すぐは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;} 
} 

:これらの属性を使用すると、以下の設定で正常に動作します

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も、この場合には使用されません。ここで は、私が試したものです:

ませ輸出は制約一致する見つかりませんでした:ContractName System.Lazy(テストを

var ac = new AggregateCatalog(); 
ac.Catalogs.Add(new DirectoryCatalog(".")); 
var c = new CompositionContainer(ac); 
var a = c.GetExportedValue<Lazy<A,IMetadata>>(); 

上記の最後の行は次のように、例外ImportCardinalityMismatchExceptionをスローします。 、Test.IMetadata)RequiredTypeIdentity System.Lazy(Test.A、Test.IMetadata)

私は、エクスポートされた値(タイプインスタンスとそのメタデータの組を取得するためのいくつかの方法がなければならないと信じている)を直接使用せずそのクラスのいくつかのプロパティにエクスポートされた値を格納するためにImportAttributeが使用されるダミークラスです。

この問題で私を助けてください、私はまだMEFとプリズムを使い始めますよ。ご協力いただきありがとうございます!

答えて

1

確かな方法があります!エクスポートを別のクラスにインポートする必要はありません。ただ、GetExport < T、TMetadataView>メソッドを使用します。あなたのコードに基づいて、私はそれを追加することによってのみ動作製:

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

これはちょうどあなたが欲しいもの、レイジー< T、TMetadataView>

ホープ、このことができます返されます!

+0

これは少し隠されている、本当に助けてくれてありがとう。私が気にしていた問題は、他の問題に関わって以来、遠く離れています。私はまだこれをテストしていませんが、うまくいくはずです。 – Hopeless

関連する問題