Disons que vous essayez de lire cette propriété
var town = Staff.HomeAddress.Postcode.Town;
Quelque part le long de la chaîne, il pourrait y avoir une nullité. Quelle serait la meilleure façon de lire la ville ?
J'ai expérimenté quelques méthodes d'extension...
public static T2 IfNotNull<T1, T2>(this T1 t, Func<T1, T2> fn) where T1 : class
{
return t != null ? fn(t) : default(T2);
}
var town = staff.HomeAddress.IfNotNull(x => x.Postcode.IfNotNull(y=> y.Town));
o
public static T2 TryGet<T1, T2>(this T1 t, Func<T1, T2> fn) where T1 : class
{
if (t != null)
{
try
{
return fn(t);
}
catch{ }
}
return default(T2);
}
var town = staff.TryGet(x=> x.HomeAddress.Postcode.Town);
Évidemment, il ne s'agit que d'abstraire la logique et de rendre le code (un peu) plus lisible.
Mais existe-t-il un moyen meilleur/plus efficace ?
EDITAR:
Dans mon cas particulier, les objets sont renvoyés par un service WCF et je n'ai aucun contrôle sur l'architecture de ces objets.
EDIT 2 :
Il y a aussi cette méthode :
public static class Nullify
{
public static TR Get<TF, TR>(TF t, Func<TF, TR> f) where TF : class
{
return t != null ? f(t) : default(TR);
}
public static TR Get<T1, T2, TR>(T1 p1, Func<T1, T2> p2, Func<T2, TR> p3)
where T1 : class
where T2 : class
{
return Get(Get(p1, p2), p3);
}
/// <summary>
/// Simplifies null checking as for the pseudocode
/// var r = Pharmacy?.GuildMembership?.State?.Name
/// can be written as
/// var r = Nullify( Pharmacy, p => p.GuildMembership, g => g.State, s => s.Name );
/// </summary>
public static TR Get<T1, T2, T3, TR>(T1 p1, Func<T1, T2> p2, Func<T2, T3> p3, Func<T3, TR> p4)
where T1 : class
where T2 : class
where T3 : class
{
return Get(Get(Get(p1, p2), p3), p4);
}
}
de cet article http://qualityofdata.com/2011/01/27/nullsafe-dereference-operator-in-c/