C# 长嵌套调用中任何属性的空检查

C# 长嵌套调用中任何属性的空检查,c#,func,C#,Func,难以用语言解释,因此我将提供一个示例 我想在Razor中输出它(但它是否是Razor并不重要,我的问题是关于c#): SomeClass中的任何一个都可以为null(这是一个我并没有真正影响的外部api) 所以我试了一下: @functions{ private string Safe(Func<string> val, string defaultValue) { try { return v

难以用语言解释,因此我将提供一个示例

我想在Razor中输出它(但它是否是Razor并不重要,我的问题是关于c#):

SomeClass中的任何一个都可以为null(这是一个我并没有真正影响的外部api)

所以我试了一下:

@functions{
    private string Safe(Func<string> val, string defaultValue)
    {        
        try 
        {
            return val.Invoke();
        }
        catch(NullReferenceException ex)
        {
            return defaultValue;
        }
    }
}
但是没有雪茄。。。 有没有办法做到这一点?Thx

更新1:
使用NullReferenceException显然更好。

您应该传递整个调用:

@Safe(() => SomeClass.SomeClass.SomeClass.ID.ToString(), "value not found")

必须这样做的原因是,现在异常将发生在方法内部。否则,它将在到达ToString方法之前抛出NullReferenceException。

您应该传递整个调用:

@Safe(() => SomeClass.SomeClass.SomeClass.ID.ToString(), "value not found")

必须这样做的原因是,现在异常将发生在方法内部。否则,它将在到达ToString方法之前抛出一个NullReferenceException。

我认为您已经非常接近了。这里的问题是,传递ToString函数需要能够解析ToString,这要求链中的所有对象都不为null。尝试传入lambda而不是ToString函数,这将推迟查找,直到您尝试对其求值(在lambda内部):


我觉得你很接近。这里的问题是,传递ToString函数需要能够解析ToString,这要求链中的所有对象都不为null。尝试传入lambda而不是ToString函数,这将推迟查找,直到您尝试对其求值(在lambda内部):


在任何情况下,都不要对控制流使用异常处理。你正在吞下这里所有的例外。您永远不会发现崩溃,但您的用户会发现。更好地捕获特定异常。你总是可以抓住NullPointerException,让其余的失败。你们都是绝对正确的。我将更改示例。甚至不要捕获NullRefException!这些应该为bug保留,因为在>>90%的情况下它们都是bug。只是按照惯例,永远不要造成一个NullRefEx。;这段代码对我来说太可怕了。我理解并感谢你的输入,usr。但这并不能完全解决我的问题。在任何情况下,都不要对控制流使用异常处理。你正在吞下这里所有的例外。您永远不会发现崩溃,但您的用户会发现。更好地捕获特定异常。你总是可以抓住NullPointerException,让其余的失败。你们都是绝对正确的。我将更改示例。甚至不要捕获NullRefException!这些应该为bug保留,因为在>>90%的情况下它们都是bug。只是按照惯例,永远不要造成一个NullRefEx。;这段代码对我来说太可怕了。我理解并感谢你的输入,usr。但这并不能完全解决我的问题。天空敞开,一道亮光照在肯尼斯身上,远处可以听到一个唱诗班用一个声音唱着“哈利路亚”。换句话说,这是可行的。谢谢。天空敞开,一道亮光照在肯尼斯身上,远处可以听到一个唱诗班用一个声音唱着“哈利路亚”。换句话说,这是可行的。谢谢。谢谢。因为肯尼思稍早一点,我所能做的就是投你一票。谢谢,但是因为肯尼思稍早一点,我所能做的就是投你一票。
@Safe(() => SomeClass.SomeClass.SomeClass.ID.ToString(), "value not found")
@Safe(() => SomeClass.SomeClass.SomeClass.ID.ToString(), "value not found")