StackExchange的人们,这是我的第一篇文章,因为我已经尽力自己解决这个问题,而且我找不到与AS3中的解决方案相匹配的非常好的解决方案。
AS3代码:
//create player
R.instance({_origin: this, _updatable: 1, _saveToXML: 1, _bodyType: "DYNAMIC", _type: "o_nape_player", _sprite: "idle/CharacterIdle", _x: -32, _y: -512});
//R.instance function exposed + showing how the parameters_ get's passed through
class RInstance {
public static function create(parameters_:Object = null):Dynamic {
var instance:XxxxObject = null;
var _type:String = parameters_._type;
switch (_type) {
case "o_nape_player": instance = new O_nape_player(parameters_);
}
parameters_._origin.addToArrayObject( instance );
return instance;
}
}
//o_nape_player.as
public function XxxxObject(parameters_:Object = null) {
parameters = parameters_;
}
protected function set parameters(parameters_:Object):void {
var parameter:String;
for (parameter in parameters_) {
this[parameter] = parameters_[parameter];
}
parameters_ = null;
}
正如标题所说,在Haxe中,我如何设置类的变量,基于一组准备解压缩的类变量?
我最接近的,但这不是我想要的结果,因为它需要setter功能:
override public function set_parameters(object:Dynamic):Void {
for (param in Reflect.fields(object)) {
try {
Reflect.callMethod(this, Reflect.field(this, "set" + param.charAt(0).toUpperCase() + param.substr(1)), [Reflect.field(object, param)]);
} catch (e:Dynamic) {
//....
}
}
}
感谢您的时间。我必须强调,正如我刚才所说,这不是我想要的结果,我希望我的Haxe代码尽可能与我的AS3代码对齐,我的AS3代码不需要setter函数,来设置属于的变量上课。
TL; DR
通过上面发布的所有代码,我可以简单地重新解释这个问题; 我怎样才能在Haxe中尽可能简单地复制它: 这[参数] = parameters_ [参数];
答案 0 :(得分:3)
最明显的解决方案实际上是使用Reflect
API:
function setAs(other:Test)
{
for (f in Reflect.fields(other))
Reflect.setField(this, f, Reflect.field(other, f));
}
更完整的示例:Try Haxe #0a6C3。
注意:
Reflect.getProperty
和Reflect.setProperty
。foo[field] = bar[field] = val
摘要包装它们,Haxe可以使用类似地图的语法(haxe.DynamicAccess
)访问对象字段。它是Reflect
API之上的包装器,它更方便,特别适用于处理结构未知的对象(通常需要调用{{1很多次)。Reflect.hasField
并不可行,Std.is
,Std.instance
和Type.typeof
会很有用。