在 C# 中实例化实现 .NET 接口的 IronPython 类型

Posted

技术标签:

【中文标题】在 C# 中实例化实现 .NET 接口的 IronPython 类型【英文标题】:Instantiating IronPython Types in C# which implement a .NET interface 【发布时间】:2012-01-22 08:28:52 【问题描述】:

我正在为我用 C# 编写的 .NET 应用程序编写一个简单的插件系统。我正在尝试使用 IronPython 来完成此操作。

在我的 .NET 代码中,我创建了一个接口 IPlugin,所有插件都必须实现该接口。 该程序的用户指定了 python 文件的路径,其中可以包含许多实现 IPlugin 的类,以及不实现 IPlugin 的类。

我遇到的问题是,一旦我获得了 CompiledCode 对象及其 ScriptScope,我想遍历代码中定义的所有类,然后实例化那些实现 IPlugin 接口的新实例。我不知道该怎么做,除了盲目地实例化所有 IronPythonType 对象,然后检查结果对象是否是 IPlugin 类型。这并不理想。

这是我目前已有的代码的 sn-p。

        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】:

试试PythonOps.IsSubClass()。我还没有测试过,但这应该可以工作:

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

【讨论】:

以上是关于在 C# 中实例化实现 .NET 接口的 IronPython 类型的主要内容,如果未能解决你的问题,请参考以下文章

c#中接口可不可以被实例化?

在c++中,接口能实例化吗?下面是接口实例化吗?operFactory是啥?我初学。

C#通过反射接口可以实例化??

C#基础-接口 抽象方法 虚方法

C#通过HttpClient请求第三方接口并实例化返回

C#通过HttpClient请求第三方接口并实例化返回