我想测试空以避免异常。我收到必须导出到 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");