Quando ottengo il risultato XML deserializzato in un albero di oggetti generato da xsd e voglio utilizzare un oggetto profondo all'interno di tale albero a.b.c.d.e.f, esso mi darà un'eccezione se manca qualsiasi nodo su quel percorso di query.Come utilizzare Expression Tree per accedere in modo sicuro al percorso degli oggetti nullable?
if(a.b.c.d.e.f != null)
Console.Write("ok");
voglio evitare il controllo per null per ogni livello in questo modo:
if(a != null)
if(a.b != null)
if(a.b.c != null)
if(a.b.c.d != null)
if(a.b.c.d.e != null)
if(a.b.c.d.e.f != null)
Console.Write("ok");
prima soluzione è quella di implementare Get metodo di estensione che permette questo:
if(a.Get(o=>o.b).Get(o=>o.c).Get(o=>o.d).Get(o=>o.e).Get(o=>o.f) != null)
Console.Write("ok");
seconda soluzione è quella implementare Get (stringa) metodo di estensione e utilizzare la riflessione per ottenere risultati come questo:
if(a.Get("b.c.d.e.f") != null)
Console.Write("ok");
terza soluzione, potrebbe essere quella di implementare e utilizzare ExpandoObject tipo dinamico per ottenere il risultato simile a questo:
dynamic da = new SafeExpando(a);
if(da.b.c.d.e.f != null)
Console.Write("ok");
Ma lo scorso 2 soluzioni non danno vantaggi della tipizzazione forte e IntelliSense.
penso che il migliore potrebbe essere la quarta soluzione che può essere implementata con Expression Trees:
if(Get(a.b.c.d.e.f) != null)
Console.Write("ok");
o
if(a.Get(a=>a.b.c.d.e.f) != null)
Console.Write("ok");
ho 1 ° e 2 ° già implementato soluzioni.
Ecco come prima soluzione si presenta come:
[DebuggerStepThrough]
public static To Get<From,To>(this From @this, Func<From,To> get)
{
var ret = default(To);
if(@this != null && [email protected](default(From)))
ret = get(@this);
if(ret == null && typeof(To).IsArray)
ret = (To)Activator.CreateInstance(typeof(To), 0);
return ret;
}
come implementare quarta soluzione, se possibile?
Inoltre sarebbe interessante vedere come implementare la terza soluzione, se possibile.
[Questa domanda] (http://stackoverflow.com/questions/3897249/how-to-avoid-multiple-if-null-checks) ha due collegamenti alle domande con risposte. Uno dipende dal compilatore di Roslyn; l'altro è un semplice snippet di codice che farà il trucco. –
Ho letto la domanda vera e le risposte sopra non indirizzano direttamente la tua domanda ma sono rilevanti e interessanti –
Recentemente ho sperimentato questo e forse la mia soluzione sarebbe interessante per te. L'ho pubblicato [qui] (http://codereview.stackexchange.com/questions/116798/improved-nullguard-v3-that-supports-property-chahod-methods-and-ignores-value-t) sulla revisione del codice. Ho scritto la mia implementazione perché volevo qualcosa di più che semplice controllo su null ;-) La tua domanda e la risposta di Servy mi hanno ispirato a provare qualcosa di diverso. – t3chb0t