我正在尝试编写一个通用扩展方法,让我这样做:
this.startDate = startDateXAttribute.NullOrPropertyOf<DateTime>(() =>
{
return DateTime.Parse(startDateXAttribute.Value);
});
Run Code Online (Sandbox Code Playgroud)
NullOrPropertyOf()将返回null如果它是一个上使用的null对象(例如,如果startDateXAttribute是null),或返回的结果Func,如果它不为空.
这种扩展方法会是什么样的?
可能重复:
C#中的安全导航操作员?
"如果object为null,则为null;如果object为null,则为object.member"的快捷方式
在我的XML处理项目中,我必须浏览链式属性以获得所需的值.例如,obj1.obj2.obj3.obj4.obj....Value.并且可能退出此链中的任何对象为null.
我用Google搜索了"c#中的NullSafe导航"并找到了一些不错的文章.从Post之一,我有了实现自定义扩展的想法.现在我对这个扩展的性能有疑问.我有这3个解决方案.任何人都可以建议我采用哪一种(在性能方面)?
选项1(使用本文中解释的逻辑):
//custom extension method
public static TOutput IfNotNull<TInput, TOutput>(this TInput x, Func<TInput, TOutput> f)
where TInput : class
where TOutput : class
{
return x == null ? null : f(x);
}
//with custom extension method -- Very neat & clean.. but what about performance?
string x = obj1
.IfNotNull(x => x.obj2)
.IfNotNull(x => x.obj3)
.IfNotNull(x => x.obj4)
.IfNotNull(x => x.obj5)
.IfNotNull(x => x.Value);
Run Code Online (Sandbox Code Playgroud)选项2:
//with NullCheck -- probably …Run Code Online (Sandbox Code Playgroud)假设我有一套车,每辆车都有一个方向盘.我想编写一行代码,在集合中查找汽车并返回其方向盘,如果汽车不在集合中,则返回null.像这样的东西:
Car found = // either a Car or null
SteeringWheel wheel = (found == null ? null : found.steeringwheel);
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点不使用found,并null在表达两次吗?我不喜欢这里重复的气味.