C# 检查多子对象是否为null的最佳方法

C# 检查多子对象是否为null的最佳方法,c#,linq,C#,Linq,我想测试null以避免异常。我收到必须导出到excel并在中显示的对象列表 Excel导出: sheet.Cells["A" + i].Value = item.Car.Door.Code; //FLCo columns.Add(c => c.Car.Door.Code).Titled("FLCo"); 网格显示: sheet.Cells["A" + i].Value = item.Car.Door.Code; //FLCo columns.Add(c => c.Car.Doo

我想测试null以避免异常。我收到必须导出到excel并在中显示的对象列表

Excel导出:

sheet.Cells["A" + i].Value = item.Car.Door.Code; //FLCo
columns.Add(c => c.Car.Door.Code).Titled("FLCo");
网格显示:

sheet.Cells["A" + i].Value = item.Car.Door.Code; //FLCo
columns.Add(c => c.Car.Door.Code).Titled("FLCo");
事情是车可以为空,门可以为空

问题1:对于excel导出,我的解决方案是使用两个
if/else
(任意 更好的方法

对于网格显示:
if/else
或“?”运算符不受支持 林克内部

以下操作将生成错误

columns.Add(c => c.Car==null?"":(c.Car.Door==null?"":c.Car.Code)).Titled("FLCo");
错误:

sheet.Cells["A" + i].Value = item.Car.Door.Code; //FLCo
columns.Add(c => c.Car.Door.Code).Titled("FLCo");
无法将lambda表达式转换为类型 “GridMvc.Columns.IGridColumn”,因为它不是 委派

Q2:你知道如何解决这个问题吗?

如果你使用的是C#6(感谢HimBromBeere,它包含在VS2015中),你可以这样写:

sheet.Cells["A" + i].Value = item?.Car?.Door?.Code;

如果任何属性为NULL,结果将为NULL。

至于Q2:您可以使用
语句lambda
s,方法是将语句括在大括号中:

所以在你的情况下是这样的

你可以用。或者,如果不支持,我更喜欢使用扩展方法

public static class Maybe
{
    public static TResult With<TInput, TResult>
        (this TInput o, Func<TInput, TResult> evaluetor)
        where TInput : class
        where TResult : class
    {
        return o == null ? null : evaluetor(o);
    }

    public static TResult Return<TInput, TResult>
        (this TInput o, Func<TInput, TResult> evaluator, TResult failureValue)
        where TInput : class
    {
        return o == null ? failureValue : evaluator(o);
    }
}
这可能是C#6的一个特性,而不是.NET的一个特性。但是,该语言仅出现在VS2015上,通常在.NET 4.6上使用。在使用VS2015时,您也可以在.NET 2.0上使用此功能。无论如何,答案不错。空传播运算符或“Elvis运算符”是C语言中最好的语法之一#