2015-11-19 21 views
5

Sto utilizzando JSON.NET per deserializzare un file JSON in un oggetto dynamic in C#.Riferimento ai membri dinamici dell'oggetto C# "dinamico"

All'interno di un metodo, vorrei passare in un string e fare riferimento a quell'attributo specificato nell'oggetto dinamico.

Ad esempio:

public void Update(string Key, string Value) 
    { 
     File.Key = Value; 
    } 

Dove File è l'oggetto dinamico, e Key è la stringa che viene passato nel dire mi piacerebbe passare nel "foo" chiave e un valore di "bar. " farei: Update("foo", "bar");, tuttavia a causa della natura del tipo di oggetto dynamic, questo si traduce in

{ 
"Key":"bar" 
} 

al contrario:

{ 
"foo":"bar" 
} 

È possibile fare ciò che sto chiedendo qui con l'oggetto dinamico?

risposta

4

ho sospetto si può usare:

public void Update(string key, string Value) 
{ 
    File[key] = Value; 
} 

Dipende da come l'oggetto dinamico implementa l'indicizzazione, ma se questo è un Json.NET JObject o simili, mi aspetto che al lavoro. È importante capire che non è garantito il funzionamento delle espressioni generali dynamic.

Se si ha realmente bisogno di questo tipo di operazione (almeno all'interno della classe), si potrebbe prendere in considerazione l'utilizzo di JObject come tipo di campo e quindi semplicemente esporlo come dynamic quando è necessario.

+0

Sei proprio corretto, ti ho battuto per circa 3 secondi :) –

+1

@SeanMissingham: Guarda la fine della mia risposta per un suggerimento su come rendere più chiaro però. –

+0

Ho appena visto, grazie! Segnerà questo come risposta grazie alla migliore spiegazione :) –

2

Okay, si scopre che sono speciale. Ecco la risposta per coloro che potrebbero inciampare in questo futuro,

Risulta che è possibile utilizzare semplicemente la chiave come un indice di matrice e funziona perfettamente. Quindi:

File[Key] = Value; funziona il modo in cui ho bisogno al contrario di File.Key = Value;

Grazie comunque!

+1

che è davvero una notevole differenza tra C# e JavaScript: In JavaScript file.Foo e file [ "Foo "] sono equivalenti. C# ha adottato questo, ma in modo incoerente come sembra. Vedi anche [this] (http://stackoverflow.com/a/33808136/1016343) risposta per un confronto di diverse dichiarazioni che funzioneranno (e quali no). – Matt

1

È possibile farlo, se si utilizza JObject da JSON.NET. Non funziona con lo ExpandoObject.

Esempio:

void Main() 
{ 
    var j = new Newtonsoft.Json.Linq.JObject(); 
    var key = "myKey"; 
    var value = "Hello World!"; 
    j[key] = value; 
    Console.WriteLine(j["myKey"]); 
} 

questo semplice esempio stampe "Ciao Mondo!" come previsto. Quindi

var File = new Newtonsoft.Json.Linq.JObject(); 
public void Update(string key, string Value) 
{ 
    File[key] = Value; 
} 

fa quello che ti aspetti.Se volete dichiarare File nell'esempio di cui sopra, come

dynamic File = new ExpandoObject(); 

si otterrebbe un errore di runtime:

CS0021 Cannot apply indexing with [] to an expression of type 'ExpandoObject'

Problemi correlati