我想知道是否可以将动态转换为其他类(部分或全部)
例如,此代码中断:
class Test {
public function new() {}
public var id: String;
}
class Main {
public static function main() {
var x:Dynamic = JsonParser.parse("{\"id\":\"sdfkjsdflk\"}");
var t:Test = cast(x, Test);
}
}
带有以下消息
类投射错误
但是,我的“Test”类有一个像动态对象一样的“id”字段。 (这是一个例子,我的用例比^^更复杂)
所以,我不明白如何从我的Dynamic中获取一个对象。
答案 0 :(得分:2)
您可以使用typedef
typedef Test = {
public var id: String;
}
class Main {
public static function main() {
var t:Test = JsonParser.parse("{\"id\":\"sdfkjsdflk\"}");
}
}
答案 1 :(得分:2)
这并不是将动态强制转换为类实例,但可能会完成同样的事情:
Type.createEmptyInstance
Reflect
示例:
import haxe.Json;
class Test {
public function new() {}
public var id: String;
}
class Main {
public static function main() {
var x:Dynamic = Json.parse("{\"id\":\"sdfkjsdflk\"}");
var t:Test = Type.createEmptyInstance(Test);
for (field in Type.getInstanceFields(Test))
if (Reflect.hasField(x, field))
Reflect.setProperty(t, field, Reflect.getProperty(x, field));
trace(t.id);
}
}
答案 2 :(得分:1)
Json.parse
返回匿名结构(依赖于实现平台),键入为Dynamic。除了Json.parse
返回Int,Float或String(一些解析器允许但实际上JSON规范不允许)之外,没有任何机会将其强制转换为动态。
这就是这种方式,因为,转换操作不会检查某些对象具有哪些字段。 cast的操作仅检查对象是否是您要转换为的类的实例。显然,匿名结构不能是任何类的实例(至少在haxe抽象内部)。
然而,执行你似乎试图执行的事情的正确方法是@Ben Morris在answer中所说的方式。