gpt4 book ai didi

c# - 从 C# 创建 IronPython 类的实例

转载 作者:太空狗 更新时间:2023-10-30 00:33:49 24 4
gpt4 key购买 nike

我想从 C# 创建一个 IronPython 类的实例,但我目前的尝试似乎都失败了。

这是我当前的代码:

ConstructorInfo[] ci = type.GetConstructors();

foreach (ConstructorInfo t in from t in ci
where t.GetParameters().Length == 1
select t)
{
PythonType pytype = DynamicHelpers.GetPythonTypeFromType(type);
object[] consparams = new object[1];
consparams[0] = pytype;
_objects[type] = t.Invoke(consparams);
pytype.__init__(_objects[type]);
break;
}

我可以通过调用 t.Invoke(consparams) 获取创建的对象实例,但是 __init__ 方法似乎没有被调用,因此我设置的所有属性未使用来 self 的 Python 脚本的。即使使用显式 pytype.__init__ 调用,构造的对象似乎仍未初始化。

使用 ScriptEngine.Operations.CreateInstance 似乎也不起作用。

我正在使用 .NET 4.0 和 IronPython 2.6 for .NET 4.0。

编辑:关于我打算如何做到这一点的小澄清:

在 C# 中,我有一个类如下:

public static class Foo
{
public static object Instantiate(Type type)
{
// do the instantiation here
}
}

在 Python 中,以下代码:

class MyClass(object):
def __init__(self):
print "this should be called"

Foo.Instantiate(MyClass)

__init__ 方法似乎从未被调用过。

最佳答案

此代码适用于 IronPython 2.6.1

    static void Main(string[] args)
{
const string script = @"
class A(object) :
def __init__(self) :
self.a = 100

class B(object) :
def __init__(self, a, v) :
self.a = a
self.v = v
def run(self) :
return self.a.a + self.v
";

var engine = Python.CreateEngine();
var scope = engine.CreateScope();
engine.Execute(script, scope);

var typeA = scope.GetVariable("A");
var typeB = scope.GetVariable("B");
var a = engine.Operations.CreateInstance(typeA);
var b = engine.Operations.CreateInstance(typeB, a, 20);
Console.WriteLine(b.run()); // 120
}

根据澄清的问题进行编辑

    class Program
{
static void Main(string[] args)
{
var engine = Python.CreateEngine();
var scriptScope = engine.CreateScope();

var foo = new Foo(engine);

scriptScope.SetVariable("Foo", foo);
const string script = @"
class MyClass(object):
def __init__(self):
print ""this should be called""

Foo.Create(MyClass)
";
var v = engine.Execute(script, scriptScope);
}
}

public class Foo
{
private readonly ScriptEngine engine;

public Foo(ScriptEngine engine)
{
this.engine = engine;
}

public object Create(object t)
{
return engine.Operations.CreateInstance(t);
}
}

关于c# - 从 C# 创建 IronPython 类的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3402713/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com