我构建了这个扩展方法:
public static class NotNullExtensionMethod
{
public static Tresult NotNull<Tin, Tresult>
(this Tin a, Func<Tin, Tresult> whenNotNull)
{
return a != null ? whenNotNull(a) : default(Tresult);
}
}
如果对象不为null,那么我可以输出:
foo.OptionalField.NotNull(r => r.SomeStringField);
如果OptionalField
为null,则输出空字符串。如果没有,它将输出字符串本身。
整个想法是避免三元运算符:
foo.OptionalField == null ? "" : foo.OptionalField.SomeStringField;
这仅适用于典型对象,我需要类似于动态对象的东西。例如,假设我有这个动态对象:
dynamic foo = new
{
optionalField = someCondition ? null : new
{
someStringField = "blah"
}
}
我喜欢使用我的NotNull
扩展方法,如下所示:
foo.NotNull(r => r.optionalField)
但是我知道不可能使用带动态的扩展方法...... 那么有什么办法可以避免做三元运算符吗?
foo.optionalField == null ? "" : foo.optionalField.someStringField;
答案 0 :(得分:2)
您是否特别需要它作为扩展方法?您可以使用using static
指令引入静态方法,以便调用:
var result = NotNull(foo, r => r.optionalField);
也许不太好,但我怀疑它和你一样好。
如评论中所述,空条件?.
和空合并??
运算符也可能有所帮助。