2013-07-26 14 views
7

Ho diversi semplici vecchi oggetti C# restituiti da un'API e diversi livelli di POCO nidificati all'interno di essi. Ho bisogno di accedere ai campi contenuti in profondità all'interno di queste strutture, ma poiché l'API lascia questi oggetti nidificati come nulli quando mancano i dati, mi ritrovo a dover fare molti controlli null solo per arrivare sul campo che voglio davvero.Controlli nulli negli oggetti nidificati

if(obj != null && obj.Inner != null && obj.Inner.Innerer != null) { ... } 

Il modulo più breve che ho trovato è quello di utilizzare l'operatore ternario.

obj != null && obj.Inner != null && obj.Inner.Innerer != null ? obj.Inner.Innerer.Field : null; 

C# ha un modo per farlo senza dover scrivere tutti quei confronti? Mi piacerebbe davvero qualcosa di breve e semplice come:

obj.Inner.Innerer.Field ?? null; 

Ma questo controlla solo Campo per null.

+0

Che dire di [questo] (http://stackoverflow.com/questions/17657942/nice-way-to-avoid-null-checks-in-ifs/17663536#17663536)? – rene

+0

Hmm, il metodo 'f' è decisamente troppo disordinato. Rende più breve la linea di codice, ma direi che il ternario è più facile da capire. Il metodo 'tc' è piuttosto vicino, ma genera un'eccezione nel metodo che è una penalità legata alle prestazioni (specialmente rispetto a un controllo Null). Così vicino, ma non esattamente quello che spero. – Syon

+0

Un'idea è che si potrebbe provare ad accedere direttamente a Inner.Innerer.Field durante il tentativo di catturare un'eccezione null. Se qualcosa lungo la strada è nullo, viene rilevata l'eccezione e si restituisce null. Altrimenti si restituisce il valore. – KappaG3

risposta

0

Non è bello, ma si potrebbe scrivere funzioni di accesso nel codice che incapsulare il null controlli in modo da avere a che fare solo in un unico posto. E.g.

Innerer GetInnerer() 
{ 
    if(obj != null && obj.Inner != null && obj.Inner.Innerer != null) 
    { 
    return obj.Inner.Innerer; 
    } 

    return null; 
} 

In questo modo si potrebbe chiamare in questo modo: if (myObject.GetInnerer() != null).... Dovresti creare un certo numero di queste funzioni, ma almeno sposterebbe la 'goreyness' del controllo nullo in una singola posizione.

Problemi correlati