2011-12-16 21 views
2

私はC#で書かれた.NETアプリケーション用の単純なプラグインシステムを作成しています。私はこれを達成するためにIronPythonを使用しようとしています。.NETインターフェイスを実装するC#のIronPython型のインスタンス化

私の.NETコードでは、すべてのプラグインが実装する必要があるインタフェースIPluginを作成しました。 プログラムのユーザーは、Pythonファイルへのパスを指定します。このパスには、IPluginを実装するクラスが多数あり、そうでないクラスもあります。

CompiledCodeオブジェクトとそのScriptScopeを取得したら、コードに定義されているすべてのクラスを反復して、IPluginインターフェイスを実装するインスタンスをインスタンス化します。私はすべてのIronPythonTypeオブジェクトを盲目的にインスタンス化するだけでなく、結果のオブジェクトがIPluginタイプであるかどうかをチェックする以外に、これをどうやって行うのか分かりません。これは理想的ではありません。

ここに、私が現在持っているコードのスニペットがあります。

 public void LoadPlugins(string filePath) { 
     try { 
      ScriptSource script = _ironPythonEngine.CreateScriptSourceFromFile(filePath); 
      CompiledCode code = script.Compile(); 
      ScriptScope scope = _ironPythonEngine.CreateScope(); 
      var result = code.Execute(scope); 

      foreach (var obj in scope.GetItems().Where(kvp => kvp.Value is PythonType)) { 
       var value = obj.Value; 
       var newObject = value(); 
       if (newObject is IPlugin) { 
        // Success. Call IPlugin methods. 
       } else { 
        // Just created an instance of something that is not an IPlugin - this is not ideal. 
       } 
      } 

     } catch (Exception) { 
      // Handle exceptions 
     } 
    } 

答えて

2

お試しPythonOps.IsSubClass()私はそれをテストしていないが、これは動作する必要があります:

if(PythonOps.IsSubClass(value, DynamicHelpers.GetPythonTypeFromType(typeof(IPlugin))) { 
    // Success. Call IPlugin methods. 
} 
+0

これは、乾杯! – Optical