2016-12-02 8 views
0

[エクスポート]属性のMEFを使用してメソッドをエクスポートしています。このメソッドをコンテナ(GetExportsを使用してメソッドを取得)で使用する必要があります。 GetExportsは、MethodInfoの抽出方法がわからないExportedDelegateオブジェクトを返します。 デバッガで検査する私はそれを私有のプロパティと見なしています。私はそれをリフレクションを使って抽出したいと思っていますが、これを行う正しい方法とは感じられません。プログラムでMEFでエクスポートされたメソッドを消費する方法は?

アイデア?

この問題はthis oneとは異なります。私は[インポート]を使用しようとしていない、私は取得し、コンテナからメソッドを使用する必要があります。

+0

[MEFで関数をエクスポートしてインポートするにはどうすればいいですか?](http://stackoverflow.com/questions/3814839/how-to-export-import-functions-and-execute-them-with -mef) – FCin

+0

私は仲間が必要なわけではないので、私はこのメソッドをプログラマチックに実行し、コンテナから直接取得する必要があります。 –

+0

なぜですか?あなたはただそれをインポートすることはできません。あなたを止めるのは何ですか? – FCin

答えて

0

そうですね、これは難しいものでしたが、ここでは参考にしています。

var importDefinition = new ImportDefinition(e => true, obj.GetType().FullName, ImportCardinality.ZeroOrMore, false, false); 

var objectsWithMethods = container.GetExports(importDefinition) 
       .Where(x => x.Value is IYourInterface) 
       .Select(x => x.Value) 
       .ToList();      

これは、方法を取得します。

これは私たちが望むのインポートを設定します。

あなたがしなければならないのは、CreateDelegate正しい方法をExportedDelegateにMEFから返された値をキャストして呼び出すことです上記の見つかったオブジェクト(objectsWithMethodを使用してforeachの中でobjectsWithMethodsを反復):

var endPointsImportDefinition = new ImportDefinition(e => true, objectsWithMethod.GetType().FullName, ImportCardinality.ZeroOrMore, false, false); 
var endPoints = container.GetExports(endPointsImportDefinition) 
         .Where(x => x.Value is ExportedDelegate) 
         .Select(x => x.Value) 
         .ToList(); 

そして最後に、あなたがメタを実行することができますMETHODINFOを(取得しますOD)あなたが使用します。

var endPointMethod = (endPoint as ExportedDelegate).CreateDelegate(typeof(Delegate)).GetMethodInfo(); 

も何ができるか:

var endPointMethod = (endPoint as ExportedDelegate).CreateDelegate(typeof(Delegate)).Method; 

それは誰にもお役に立てば幸い!

関連する問題