指定されたアセンブリの特定のインターフェイスのすべての(プロパティとコンストラクタ)インポートを一覧表示するための洗練されたMEF方法はありますか?MEF - アセンブリに必要なすべてのインポートをリフレクションなしでリストすることは可能ですか?
[Import]
または[ImportingConstructor]
属性(など)をチェックして、エクスポートされたすべてのタイプをリフレクションでスキャンできますが、MEFはすでにそれを認識していると思います。 =
指定されたアセンブリの特定のインターフェイスのすべての(プロパティとコンストラクタ)インポートを一覧表示するための洗練されたMEF方法はありますか?MEF - アセンブリに必要なすべてのインポートをリフレクションなしでリストすることは可能ですか?
[Import]
または[ImportingConstructor]
属性(など)をチェックして、エクスポートされたすべてのタイプをリフレクションでスキャンできますが、MEFはすでにそれを認識していると思います。 =
エレガントはあまりにも主観的であるので、私は私の解決策は、優雅さのあなたのコンセプトに合う願っています)
あなたは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();
}
このため、出力は次のようになります。
あなたは、たとえば、あなたがそれらの両方があり、カーディナリティまたは共有ポリシーをお知りになりたいことがあり、ImportDefinitionを定義する他のプロパティを探索しようとすることができます... =)
・ホープ、このことができます。
これは私が必要としていたもので、短く、速いです(MEFがすでにやったように、Reflectionを2回実行する必要はありません)、それは有益です。 :) –