在C#中嵌入IronPython时如何处理值类型?

klo*_*ffy 6 .net c# ironpython embedding value-type

IronPython中使用.NET值类型时有一个众所周知的问题.最近,当我尝试在C#中使用Python作为嵌入式脚本语言时,这让我很头疼.问题可归纳如下:

给定一个C#结构,例如:

struct Vector {
    public float x;
    public float y;
}
Run Code Online (Sandbox Code Playgroud)

还有一个C#类如:

class Object {
    public Vector position;
}
Run Code Online (Sandbox Code Playgroud)

IronPython中将发生以下情况:

obj = Object()
print obj.position.x    # prints ‘0’
obj.position.x = 1
print obj.position.x    # still prints ‘0’
Run Code Online (Sandbox Code Playgroud)

正如文章所述,这意味着价值类型大多是不可变的.但是,这是一个问题,因为我计划使用如上所示实现的矢量库.是否有任何变通方法可以使用依赖于值类型的现有库?修改库将是最后的手段,但我宁愿避免这种情况.

Fra*_*ger 4

无需修改库,只需使用代理即可。

struct Vector {
    public float X;
    public float Y;
}

class BetterVector {
    public float X;
    public float Y;
    public Vector Optimized { get { return new Vector(X, Y); } }
}

class Object {
    public BetterVector Position { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在,Python 代码可以正常设置字段,并且您的代码可以Optimized在需要将数据提供给 OpenGL 或 XNA 或您正在使用的任何内容时调用。

Optimized如果调用看起来工作量太大,您甚至可以使用隐式强制:

class BetterVector {
   // ...
   public static implicit operator Vector(BetterVector v) {
       return v.Optimized;
   }
}
Run Code Online (Sandbox Code Playgroud)