È possibile utilizzare la riflessione per ispezionare l'oggetto e creare una copia che modifichi ciascun valore di proprietà secondo necessità. Per coincidenza ho appena reso pubblica una nuova libreria che rende questo genere di cose davvero facile. È possibile ottenere qui: https://github.com/jamietre/IQObjectMapper
Ecco un esempio del codice si usa
var newInstance = ObjectMapper.Map(obj,(value,del) => {
return value !=null && value.GetType().IsClass ?
null :
value;
});
la "mappa" metodo itera attraverso ogni proprietà dell'oggetto, e chiede un Func<object,IDelegateInfo>
per ogni (IDelegateInfo avendo riflessione informazioni come il nome della proprietà, il tipo, ecc.). La funzione restituisce il nuovo valore per ogni proprietà. Quindi, in questo esempio, ho appena testato il valore di ogni proprietà per vedere se si tratta di una classe, e in tal caso, restituire null; in caso contrario, restituire il valore originale.
altro modo più espressivo per farlo:
var obj = new MyObject();
// map the object to a new dictionary
var dict = ObjectMapper.ToDictionary(obj);
// iterate through each item in the dictionary, a key/value pair
// representing each property
foreach (KeyValuePair<string,object> kvp in dict) {
if (kvp.Value!=null && kvp.Value.GetType().IsClass) {
dict[kvp.Key]=null;
}
}
// map back to an instance
var newObject = ObjectMapper.ToNew<MyObject>(dict);
In entrambi i casi, il valore di newInstance.myChildren
(e le altre proprietà che sono non a valore tipizzato) sarà nullo. Potresti facilmente cambiare le regole per ciò che accade in questa mappatura.
Spero che questo aiuti. A proposito, dal tuo commento sembra che JSON non sia davvero il tuo obiettivo ma solo qualcosa che hai pensato ti avrebbe aiutato a raggiungerlo. Se vuoi finire con json, serializza semplicemente l'output di questo, ad es.
string json = JavaScriptSerializer.Serialize(newObject);
Ma non vorrei coinvolgere Json se quello è stato solo un mezzo per un fine; se si desidera rimanere negli oggetti CLR, non è necessario utilizzare JSON come intermediario.
Potete mostrare qualche esempio di problema JSON? – igofed
Puoi semplicemente creare un nuovo oggetto senza figli e serializzarlo? –
Logicamente questo avrebbe senso, ma voglio spogliare qualsiasi oggetto di tipo Object dei suoi figli. Ho pensato che la serializzazione JSON sarebbe il modo migliore per farlo, ma sono decisamente aperto a suggerimenti. –