具有动态对象的NotNull扩展方法,用于避免三元运算符

时间:2018-04-17 16:30:31

标签: c#

我构建了这个扩展方法:

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;

1 个答案:

答案 0 :(得分:2)

您是否特别需要它作为扩展方法?您可以使用using static指令引入静态方法,以便调用:

var result = NotNull(foo, r => r.optionalField);

也许不太好,但我怀疑它和你一样好。

如评论中所述,空条件?.和空合并??运算符也可能有所帮助。