【发布时间】:2011-08-10 07:41:12
【问题描述】:
假设您正在尝试读取此属性
var town = Staff.HomeAddress.Postcode.Town;
在链的某处可能存在空值。 阅读 Town 的最佳方式是什么?
我一直在尝试几种扩展方法...
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));
或
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);
显然,这些只是抽象出逻辑并使代码(稍微)更具可读性。
但是有没有更好/更有效的方法?
编辑:
在我的特殊情况下,对象是从 WCF 服务返回的,我无法控制这些对象的体系结构。
编辑 2:
还有这个方法:
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);
}
}
来自这篇文章http://qualityofdata.com/2011/01/27/nullsafe-dereference-operator-in-c/
【问题讨论】:
-
我更喜欢你的 IfNotNull 方法。
-
这是一篇不错的博客文章 - Nullsafe dereference operator (?.) in C#。在 Connect here 和 here 上也有建议。
-
@Danko:这篇文章很棒!
-
这是一个类似的问题(在 Dve 的问题之后发布):stackoverflow.com/questions/17672481/…
标签: c# .net properties logic