2014-12-06 43 views
1

我想知道,如果可能的話蒙上了動態到其他類(部分或全部)連鑄動態到其他類

例如,這個代碼斷:

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); 
    } 
} 

與以下消息

類鑄造錯誤

何wever,我的「Test」類有一個像動態對象一樣的「id」字段。 (這是一個例子,我的用例比這更復雜^^)

所以,我不明白如何從我的動態獲取對象。

回答

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); 
    } 
} 
1

你可以使用typedef

typedef Test = { 
    public var id: String; 
} 

class Main { 
    public static function main() { 
     var t:Test = JsonParser.parse("{\"id\":\"sdfkjsdflk\"}"); 
    } 
} 
+0

你好,我的問題是關於鑄造動態到一個類。書面的代碼只是一個例子,我只是想知道這是可能的:)謝謝 – Peekmo 2014-12-06 10:40:52

+0

var t:Test = cast x; – Andrew 2014-12-06 10:49:31

+0

http://haxe.org/manual/expression-cast-unsafe.html – Andrew 2014-12-06 10:56:48

1

Json.parse返回匿名結構(實施依賴於平臺),類型爲動態。除了Dynamic,除非Json.parse返回一些解析器允許的Int,Float或String,但它實際上並未被JSON規範允許,否則沒有單一機會將其轉換爲Dynamic。

這是因爲,鑄造的操作不檢查某些對象具有的字段。鑄造操作僅檢查對象是否是要投射到的類的實例。顯然,匿名結構不能成爲任何類的實例(至少在haxe抽象中)。

然而,執行你似乎試圖執行的事情的正確方法是@Ben Morris在他的answer中所述的方式。