2016-06-17 19 views
0

私は、特定のインターフェイスを実装するさまざまなオブジェクトを持っています。 私のコードの1つの場所で、私はインターフェイスのすべてのエクスポートを取得し、実際のクラス名をDBに保存します。いくつかの素早く汚れた疑似があります:クラス名を実装してエクスポートされたインターフェイスを取得する

これはうまく動作し、私は簡単にすべての実装を得ることができます。 しかし、後で特定のクラス名の新しいインスタンスを取得する必要もあります。

私が_container.GetExportedValues<ISomething>を試すと、SomethingSomethingElseの両方が得られます。私が試してみたら_container.GetExportedValue<ISomething>("SomethingElse")私は、制約に合ったエクスポートを見つけることができないという構成エラーが出ます。

したがって、クラスの名前のみを知って、SomethingElseの新しいインスタンスを取得するにはどうすればよいですか?

[Export(typeof(SomethingElse))] 
[PartCreationPolicy(CreationPolicy.NonShared)] 
public class SomethingElse : ISomething { } 
その後

_container.GetExportedValue<SomethingElse>作品:

答えて

1

インターフェイス名またはカスタム名のいずれかをインポートできるように、2つのエクスポート属性を指定できます。このような

何か:はい

class Test 
{ 
    [ImportMany] 
    IEnumerable<ISomething> _somethings; 

    [Import("SomethingElse", typeof(ISomething))] 
    SomethingElse _somethingElse; 
} 
+0

ああ、必要な契約名を '[Export]'属性に入れることができます...賢い。契約名に完全修飾クラス名を自動的に入れる方法はありますか?コードでは 'typeof(Something).FullName'を実行できますが、属性にはできません。 – GTHvidsten

+0

@GTHvidsten、AFAIK、それを行う方法はありません。 – dymanoid

0

あなたがSomethingElse expliciteをエクスポートする必要があります。エクスポートに名前を付けることで、同じクラスをエクスポートすることもできます。

[Export("SomethingElse", typeof(ISomething))] 
+0

が、その時点でコードが 'SomethingElse'の種類について知っていません:

public interface ISomething { } [Export(typeof(ISomething))] [Export("Something", typeof(ISomething))] public class Something : ISomething { } [Export(typeof(ISomething))] [Export("SomethingElse", typeof(ISomething))] public class SomethingElse : ISomething { } 

さて、あなたはこれを行うことができます。クラス自体ではなく、 'SomethingElse'クラスの名前を含んでいる文字列しかありません...そして、私は決してその参照を持っていません。 – GTHvidsten

関連する問題