在长嵌套调用中空检查任何属性

时间:2014-01-24 13:02:17

标签: c# func

难以用文字解释,所以我将提供一个例子。

我想在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显然更好。

2 个答案:

答案 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")