2014-03-28 77 views
2

我知道這是可以從一個符號創建一個實例就像這個鏈接所示:在沒有Dart類的情況下從String/Symbol創建對象的實例?

Create an instance of an object from a String in Dart?

但是,這並不適合我,因爲我想要做的是沒有創建一個實例工作有班級。

導致此問題,因爲我有一個內部列表中的一個類:

class MyNestedClass { 
    String name; 
} 

class MyClass { 
    int i, j; 
    String greeting; 
    List<MyNestedClass> myNestedClassList; 
} 

我要地圖轉換爲這個類:

{ 
     "greeting": "hello, there", 
     "i": 3, 
     "j": 5, 
     "myNestedClassList": [ 
      { 
      "name": "someName1" 
      },{ 
      "name": "someName2" 
      } 
     ] 
    } 

現在我做這樣的事情這個:

static void jsonToObject(String jsonString, Object object) { 
    Map jsonMap = JSON.decode(jsonString); //Convert the String to a map 
    mapToObject(jsonMap, object); //Convert the map to a Object 
    } 

    static void mapToObject(Map jsonMap, Object object) { 
    InstanceMirror im = reflect(object); //get the InstanceMirror of the object 
    ClassMirror cm = im.type; //get the classMirror of the object 

    jsonMap.forEach((fieldNameStr, fieldValue) { // For each element in the jsonMap 
     var fieldName = new Symbol(fieldNameStr); // convert the fieldName in the Map to String 

     if (isPrimitive(fieldValue)) { // if fieldValue is primitive (num, string, or bool 
       im.setField(fieldName, fieldValue); //set the value of the field using InstanceMirror 
     } else if (fieldValue is List) { // else if the fieldValue is a list 
      ClassMirror listCm = (cm.declarations[fieldName] as VariableMirror).type; //get the class mirror of the list 
      var listReflectee = listCm.newInstance(const Symbol(''), []).reflectee; //create an instance of the field 

      for(var element in fieldValue) { //for each element in the list 
      if(!isPrimitive(element)) { // if the element in the list is a map (i.e not num, string or bool) 
       var listType = listCm.typeArguments[0]; //get the TypeMirror of the list (i.e MyNestedClass from List<MyNestedClass>) 

       //This is the line that doesn't work correctly 
       //It should be something like: 
       // 
       //  ClassMirror.fromSymbol(listType.simpleName).newInstance(const Symbol(''), []); 
       // 
       var listObject = (listType as ClassMirror).newInstance(const Symbol(''), []); //create an instance of the specified listType 

       mapToObject(element, listObject); //convert the element to Object 
      } 
      listReflectee.add(element); //add the element to the list 
      }; 
     } else { //else (the field value is a map 
     ClassMirror fieldCm = (cm.declarations[fieldName] as VariableMirror).type; // get the field ClassMirror from the parent declarations 
     var reflectee = fieldCm.newInstance(const Symbol(''), []).reflectee; //create an instance of the field 
     mapToObject(fieldValue, reflectee); // convert the fieldValue, which is a map, to an object 
     im.setField(fieldName, reflectee); // set the value of the object previously converted to the corresponding field 
     } 
    }); 
    } 

正如你可以看到實際上沒有工作的線是:

var listType = listCm.typeArguments[0]; //get the TypeMirror of the list (i.e MyNestedClass from List<MyNestedClass>) 
var listObject = (listType as ClassMirror).newInstance(const Symbol(''), []); //create an instance of the specified listType 

因爲他們在localClassMirror而不是MyNestedClass上創建實例。我在尋找類似的方法:

ClassMirror.fromSymbol(listType.simpleName).newInstance(const Symbol(''), []); 

你可以看到在接下來的URL完整的源代碼:

DSON Source Code

回答

1

如果你有類的全限定名,你應該能夠使用libraryMirror找到類型,然後它應該與鏈接的問題相似以創建實例。 我還沒有做過這件事,並沒有代碼在手。

還看到:how to invoke class form dart library string or file

另一種方法是,你註冊他們的名字所支持的類型或一個ID,並在此地圖查找類型(就像它的創建地圖在應用程序初始化時間在Go中完成)

+0

鏈接問題的答案中的代碼應該是您正在查找的內容。我更新了代碼以反映自答案寫入後的API更改。 –

相關問題