2015-12-01 24 views
5

Ho una situazione in cui è necessario assegnare alcune proprietà di oggetti all'interno di un inizializzatore di oggetti. Alcuni di questi oggetti possono essere nulli e ho bisogno di accedere alle loro proprietà, il problema è che sono troppi e usare una cosa if/else non è buona.Esiste un modo per imitare l'operatore C-6 Null-C in C# 5

Esempio

visits = visitJoins.AsEnumerable().Select(joined => new VisitPDV() 
{ 
    VisiteId = joined.Visite.VisiteId.ToString(), 
    NomPointDeVente = joined.VisitePdvProduit.PointDeVente.NomPointDeVente,    
}); 

Il joined.VisitePdvProduit può essere nullo, e il problema è che ci sono come decine di tali assegnazioni (ho preso uno per accorciare il codice)

Il C# 6Null-Conditional operator è la soluzione perfetta per questa situazione, il problema è che sono su C# 5 in questo progetto, c'è un modo per imitarlo?

+1

Creare un metodo di estensione – MikeSW

+1

ne dite 'visitJoins.AsEnumerable(). Dove (vj => vj.VisitePdvProduit! = Null) .Select (unito => nuovi VisitPDV()' –

+0

@ClayVerValen come ho detto ho più assegnazioni così, l'ho appena accorciato per evitare un lungo codice qui, fare il tuo suggerimento non aiuterà. – AymenDaoudi

risposta

6

Beh, è ​​possibile utilizzare un metodo di estensione che riceve un delegato di accesso e lo esegue solo se l'articolo non è null:

public static TResult ConditionalAccess<TItem, TResult>(this TItem item, Func<TItem, TResult> accessor) where TResult : Class 
{ 
    if (item == null) 
    { 
     return null; 
    } 
    else 
    { 
     return accessor(item); 
    } 
} 

si può utilizzare per esempio come questo:

NomPointDeVente = joined.VisitePdvProduit.ConditionalAccess(_ => _.PointDeVente.NomPointDeVente); 

È possibile creare facilmente versioni di questo metodo per operazioni che non restituiscono un valore (ad esempio bar.ConditionalAccess(_ => _.Foo())) o tipi di valori restituiti.

+0

Funzionerebbe solo per l'espansione delle proprietà di livello superiore. – Amy

+1

@Amy Perché? È possibile utilizzare l'estensione più volte ... – i3arnon

+1

piuttosto pulito – AymenDaoudi

1

In questo modo. Brutto, ma cosa doveva essere fatto.

visits = visitJoins.AsEnumerable().Select(joined => new VisitPDV() 
{ 
    VisiteId = joined.Visite.VisiteId.ToString(), 
    NomPointDeVente = (joined.VisitePdvProduit == null) ? null : joined.VisitePdvProduit.PointDeVente.NomPointDeVente,    
}); 
+1

Non merita un downvote, non so perché, vero è un po 'brutto come hai detto, ma fa il lavoro, ed è comprensibile, potenziato. – AymenDaoudi

0

Se si sta parlando il semi-molto sorpreso operatore ?., quindi no. Non c'è modo di imitare la sintassi.

Ciò che si può fare, tuttavia, è creare un metodo di estensione (o un metodo di supporto, uno statico, preferibilmente) o un metodo di istanza che funzioni con le proprietà.

Oppure, come suggerito da qualcuno, basta usare l'istruzione condizionale (in linea o esplicita). Ma non è quello che stai cercando, ovviamente.

Un altro metodo (ed è affatto raccomandabile) è quello di circondare l'assegnazione con un try-catch. Ma questa è la soluzione davvero baaad e la cito solo per completezza.

+0

No. [Questo operatore: '? .'] (https://msdn.microsoft.com/en-us/library/dn986595.aspx). –

+1

" operatore molto sorpreso "? È un errore? – Amy

+0

Sì @NickWhaley che uno, thx per la precisione – AymenDaoudi