我想测试null以避免异常。我收到了必须导出到excel并在Grid.Mvc
中显示的对象列表Excel导出:
sheet.Cells["A" + i].Value = item.Car.Door.Code; //FLCo
网格显示:
columns.Add(c => c.Car.Door.Code).Titled("FLCo");
Car 可以为null,门可以为null。
Q1:对于excel导出,我的解决方案是使用几个
if/else
(任何 更好的方式)?对于网格显示:
if/else
或“?”不支持运算符 在linq里面
以下将生成错误
columns.Add(c => c.Car==null?"":(c.Car.Door==null?"":c.Car.Code)).Titled("FLCo");
错误:
无法将lambda表达式转换为type 'GridMvc.Columns.IGridColumn'因为它不是 代表
Q2:知道如何解决这个问题吗?
答案 0 :(得分:5)
如果您正在使用C#6(包含在VS2015中,感谢HimBromBeere。),您可以按照以下方式编写它:
sheet.Cells["A" + i].Value = item?.Car?.Door?.Code;
如果任何属性为NULL,则结果为NULL。
答案 1 :(得分:2)
至于 Q2 :您可以使用statement lambda
将语句括在花括号中: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");
答案 2 :(得分:1)
您可以使用"Elvis operator"。或者如果不支持,我更喜欢使用扩展方法。
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");