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)
正如文章所述,这意味着价值类型大多是不可变的.但是,这是一个问题,因为我计划使用如上所示实现的矢量库.是否有任何变通方法可以使用依赖于值类型的现有库?修改库将是最后的手段,但我宁愿避免这种情况.
无需修改库,只需使用代理即可。
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)
| 归档时间: |
|
| 查看次数: |
1281 次 |
| 最近记录: |