难以用文字解释,所以我将提供一个例子。
我想在Razor中输出这个(但是它的剃须刀并不重要,我的问题是关于c#):
@SomeClass.SomeClass.SomeClass.ID.ToString()
任何SomeClass都可以为null(这是一个我没有影响的外部api)
所以我尝试了这个:
@functions{
private string Safe(Func<string> val, string defaultValue)
{
try
{
return val.Invoke();
}
catch(NullReferenceException ex)
{
return defaultValue;
}
}
}
然后这个:
@Safe(SomeClass.SomeClass.SomeClass.ID.ToString, "value not found")
但没有雪茄...... 有没有办法实现这个目标? THX。
UPDATE1: 使用NullReferenceException显然更好。
答案 0 :(得分:5)
你应该通过整个电话:
@Safe(() => SomeClass.SomeClass.SomeClass.ID.ToString(), "value not found")
你必须这样做的原因是因为现在异常将在你的方法中发生。否则它会在它到达ToString方法之前抛出NullReferenceException。
答案 1 :(得分:2)
我觉得你很亲密。这里的问题是传递ToString函数要求您能够解析ToString,这需要链中的所有对象都为非null。尝试传递lambda而不是ToString函数,这将推迟查找,直到你尝试评估它(在lambda内):
@Safe(() => SomeClass.SomeClass.SomeClass.ID.ToString(), "value not found")