将Dynamic转换为其他类

时间:2014-12-06 09:54:34

标签: haxe

我想知道是否可以将动态转换为其他类(部分或全部)

例如,此代码中断:

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中获取一个对象。

3 个答案:

答案 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
  • 设置新类实例上Dynamic对象的所有字段

示例:

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中所说的方式。