我正在为用C#编写的.NET应用程序编写一个简单的插件系统。我正在尝试使用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
}
}
答案 0 :(得分:2)
试试PythonOps.IsSubClass()
。我没有测试过,但这应该可行:
if(PythonOps.IsSubClass(value, DynamicHelpers.GetPythonTypeFromType(typeof(IPlugin))) {
// Success. Call IPlugin methods.
}