2017-12-23 2 views
0

Hier ist mein Code, der eine Json zu einer Klasse von meinem eigenen konvertiert:Generic Array-Konstruktor

JSONArray boats = p["data"]["game"]["start"]["boats"].AsArray; 
j.data.game.start.boats = new JsonGameDetailBoat[boats.Count]; 
for (int i = 0; i < boats.Count; i++) { 
    JSONNode boat = boats[i]; 
    j.data.game.start.boats[i] = new JsonGameDetailBoat { 
     name = boat["name"], 
     total = boat["total"] 
    }; 
} 
JSONArray board = p["data"]["game"]["board"].AsArray; 
j.data.game.board = new JsonGameDataCell[board.Count][]; 
for (int i = 0; i < board.Count; i++) { 
    /* almost same code than previous loop */ 
} 

die letzten Zeilen sehen: Ich habe eine andere Schleife zu machen, die gleiche Sache zu machen.

Und ich muss das noch 4 mal machen.

Also ich versuche, eine generische, die ein JSONArray in eine benutzerdefinierte Klasse konvertieren würde, und holen Sie jede Eigenschaften von als Zeichenfolge und lesen Sie sie aus dem JSON-Array.

Mein Code sieht so aus, aber es funktioniert nicht, und ich weiß nicht, ob es möglich ist, die öffentlichen Eigenschaften einer Klasse aufzuzählen.

public class JSONArrayConverter<T> 
{ 
    public JSONArrayConverter(JSONNode p) 
    { 
     JSONArray tab = p.AsArray; 
     IList<T> result; 
     for (int i = 0; i < tab.Count; i++) { 
      JSONNode value = tab[i]; 
      result[i] = new <T>(); 
     } 
    } 
} 

Dieser Code funktioniert nicht, ich bin hier fest: result[i] = new <T>();

+0

Zwei Dinge des Rückrufs. 1) 'neue Liste ()' und 2) müssen Sie angeben, T ' – Draco18s

+0

Drei Dinge: 3)' Ergebnis' ist die Liste, müssen Sie 'Ergebnis' auf die Liste, nicht ein Element der Liste. – Draco18s

Antwort

2

Sie Reflection

public JSONArrayConverter(JSONNode p) 
{ 
    JSONArray tab = p.AsArray; 
    IList<T> result = new List<T>(); 
    for (int i = 0; i < tab.Count(); i++) 
    { 
     JSONNode value = tab[i]; 
     result[i] = (T)Activator.CreateInstance(typeof(T), value); 
    } 
} 

oder eine Schnittstelle verwenden können:

public interface JSONConvertable 
{ 
    void Initialise(JSONNode node); 
} 

public class JSONArrayConverter<T> where T : JSONConvertable, new() 
{ 
    public JSONArrayConverter(JSONNode p) 
    { 
     JSONArray tab = p.AsArray; 
     IList<T> result = new List<T>(); 
     for (int i = 0; i < tab.Count(); i++) 
     { 
      JSONNode value = tab[i]; 
      result[i] = new T(); 
      result[i].Initialise(value); 
     } 
    } 
} 

EDIT:

Oder

public JSONArrayConverter(JSONNode p, Func<JSONNode, T> creator) 
{ 
    JSONArray tab = p.AsArray; 
    IList<T> result = new List<T>(); 
    for (int i = 0; i < tab.Count(); i++) 
    { 
     JSONNode value = tab[i]; 
     result[i] = creator(value); 
    } 
} 
+0

Dies ist nicht generisch, weil Sie die Schlüssel '" name "' und '" total "' Ich möchte eine Schleife auf die Eigenschaften der Klasse machen '' –

+0

Nun, Sie könnten nur Wert als Parameter haben – rokkerboci

+0

Ich möchte nicht auf die Eigenschaften Schleife, lassen Sie die Klasse selbst behandeln. Die Verwendung von Reflektion wäre unordentlich und sehr langsam. – rokkerboci