2017-11-22 8 views
0

指定されたアセンブリの特定のインターフェイスのすべての(プロパティとコンストラクタ)インポートを一覧表示するための洗練されたMEF方法はありますか?MEF - アセンブリに必要なすべてのインポートをリフレクションなしでリストすることは可能ですか?

[Import]または[ImportingConstructor]属性(など)をチェックして、エクスポートされたすべてのタイプをリフレクションでスキャンできますが、MEFはすでにそれを認識していると思います。 =

答えて

1

エレガントはあまりにも主観的であるので、私は私の解決策は、優雅さのあなたのコンセプトに合う願っています)

あなたはSystem.ComponentModel.Composition.ReflectionModelであるReflectionModelServicesクラスを使用することができます。その名前が示すように、Reflectionを内部的に使用しますが、MEFの一部であり、MEFはリフレクションを使用します。

と言えば、と書かれていますが、このタイプの反射を直接参照するとします。だから、上に行くことができます...

レッツは、私たちは次のことを持っていると言う:

internal interface IFoo { } 

internal class Boo : IFoo 
{ 
    [Import] public string SomeString; 

    [ImportingConstructor] 
    public Boo(int someInt) { } 
} 

internal class Moo : IFoo 
{ 
    [Import] public float SomeFloat; 
} 

次に、あなたがあなたのカタログを作成しているところはどこでも(私のためにコンソールアプリケーションのメインであることを起こっ)あなたが反復処理しますカタログの部品及び各部品のインポート定義を検査:

private static void Main(string[] args) 
{ 
    var regBuilder = new RegistrationBuilder(); 
    regBuilder.ForTypesMatching(t => typeof(IFoo).IsAssignableFrom(t)) 
     .Export<IFoo>(); 
    var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly(), regBuilder); 

    foreach (var composablePartDefinition in catalog.Parts) 
     if (typeof(IFoo).IsAssignableFrom(ReflectionModelServices.GetPartType(composablePartDefinition).Value)) 
      foreach (var importDefinition in composablePartDefinition.ImportDefinitions) 
       Console.WriteLine(
        $"Contract name: {importDefinition.ContractName}. Is parameter (for ImportingConstructor stuff): {ReflectionModelServices.IsImportingParameter(importDefinition)}"); 
    Console.ReadLine(); 
} 

このため、出力は次のようになります。

enter image description here

あなたは、たとえば、あなたがそれらの両方があり、カーディナリティまたは共有ポリシーをお知りになりたいことがあり、ImportDefinitionを定義する他のプロパティを探索しようとすることができます

... =)

・ホープ、このことができます。

+0

これは私が必要としていたもので、短く、速いです(MEFがすでにやったように、Reflectionを2回実行する必要はありません)、それは有益です。 :) –

関連する問題