Реализация типов IronPython в C #, которые реализуют интерфейс .NET - PullRequest
2 голосов
/ 17 декабря 2011

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

1 Ответ

2 голосов
/ 17 декабря 2011

Попробуйте PythonOps.IsSubClass().Я не проверял это, но это должно работать:

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