检查多子对象为 null 的最佳方法



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

Excel导出:

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

网格显示:

columns.Add(c => c.Car.Door.Code).Titled("FLCo");

问题是汽车可以为空,可以为空。

Q1:对于excel导出,我的解决方案是使用几个if/else(任何 更好的方法)?

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

以下将生成错误

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

错误:

无法将 lambda 表达式转换为类型 "GridMvc.Columns.IGridColumn",因为它不是 委托

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

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

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

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

至于 Q2:您可以通过将语句括在大括号中使用 statement lambda s:https://msdn.microsoft.com/de-de/library/bb397687.aspx#Anchor_1

所以在你的情况下,这将是

columns.Add(c => {c.Car==null?"":(c.Car.Door==null?"":c.Car.Code)}).Titled("FLCo");
您可以使用

"猫王运算符"。或者,如果不支持,我更喜欢使用扩展方法。

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);
    }
}

所以在代码中你可以做一些类似的事情

sheet.Cells["A" + i].Value = item.With(x => x.Car).With(x => x.Door).Return(x => x.Code, "null");

相关内容

  • 没有找到相关文章

最新更新