Я пишу простую систему плагинов для моего приложения .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
}
}