2015-08-07 23 views
5

Supponiamo che io stia ricevendo un flusso infinito di oggetti "anonimi" come (JSON/XML/qualsiasi altro) che dovrebbero essere della stessa classe, tuttavia non tutti gli oggetti contengono tutti i campi/proprietà, es:C# Crea e modifica classe in fase di esecuzione

{ 
object1 : {field1 : 1, field2: 2}, 
object2 : {field1 : 3, field4: 5} 
} 

come si può vedere se uso uno di oggetti come modello e creare una classe corrispondenza di esso, l'altro non si adatta come c'è una proprietà mancante, nel caso di oggetti limitati posso andare su di essi ed estrai tutti i campi, quindi crea una classe che si adatta a tutti e imposta le proprietà mancanti per ogni oggetto.

Tuttavia in un flusso "infinito" non è possibile farlo, quindi l'unico approccio che ho trovato è la creazione di Class1 che si adatta al primo oggetto e crea il primo oggetto, quando si passa all'oggetto successivo se c'è una proprietà aggiuntiva che aggiungo in Class1 e crea il secondo oggetto di Class1, quindi passa di nuovo per ogni oggetto. Quando si modifica Class1, tutti gli oggetti creati prima della modifica devono includere la nuova proprietà senza doverli ricreare.

Qualche idea su come farlo ??

Nota: non desidero creare una nuova classe ogni volta che trovo un nuovo campo, ci vorrà molto tempo per ricreare tutti gli oggetti vecchi e non menzionare che il numero di oggetti è in costante aumento.

+11

Perché avete bisogno di classi concrete a tutti, non lo farei qualcosa di vestibilità più dinamica meglio alle proprie necessità, come un dizionario o expandoobject o qualcosa del genere? –

+4

Non dichiarare alcuna classe. Usa 'JObject.Parse (" ... ")' (in Json.Net). Ora hai il tuo oggetto con tutte le proprietà in esso. – Eser

+0

Cosa succede se si utilizza 'Dictionary allProperties' per memorizzare le proprietà come' allProperties.Add ("field1", 1); allProperties.Add ("field4", 5); '? – Fabjan

risposta

1

Utilizzare la classe JObect della libreria Json.Net.

1- Si può usare con dynamic

string json1 = @"{object1 : {field1 : 1, field2: 2}}"; 
string json2 = @"{object2 : {field3 : 3, field2: 4}}"; 

dynamic obj = JObject.Parse(json2); 
if (obj.object1 != null) Console.WriteLine(obj.object1.field1); 
if (obj.object2 != null) Console.WriteLine(obj.object2.field3); 

2- Si può usare come dizionario

var jObj = JObject.Parse(json1); 
if (jObj["object1"] != null) Console.WriteLine(jObj["object1"]["field1"]); 

3- Supporta LINQ. È possibile enumerare facilmente per ottenere tutti i bambini/discendenti ecc

var rootProperties = jObj.Children().OfType<JProperty>() 
        .Select(p => p.Name).ToArray(); 
+0

Sto facendo l'analisi "manuale", ovvero: Non sto utilizzando JSON.NET quindi non ho accesso a JObject. –

+1

@ T.Aoukar: non puoi iniziare a utilizzare JSON.NET? –

+0

@LuisFilipe No, se posso, l'avrei già fatto. –

Problemi correlati