是否有一种方便的语法来检查可以为空的嵌套属性?

发布于 2024-12-15 13:35:41 字数 588 浏览 1 评论 0原文

可能的重复:
深度空检查,有更好的方法吗?

例如,如果您正在 Foo1.Bar1.Foo2.Bar2 上执行逻辑(并且每个属性都可以为 null),则不能只对 foo.Bar1.Foo2.Bar2 执行此操作,因为您可能会得到 null参考异常

目前这就是我所做的

if (foo1!=null && foo1.Bar1!=null && foo1.Bar1.Foo2 !=null && foo1.Bar1.Foo2.Bar2!=null)
return DoStuff(foo1.Bar1.Foo2.Bar2); //actually a logic based on the value of Bar2
else return null; 

有没有更优雅或更方便的方法来做到这一点?

Possible Duplicate:
Deep Null checking, is there a better way?

for example, if you are performing a logic on Foo1.Bar1.Foo2.Bar2 (and each of the properties can be null), you can't just do that to foo.Bar1.Foo2.Bar2 because it is possible that you get null reference exception

Currently this is what I do

if (foo1!=null && foo1.Bar1!=null && foo1.Bar1.Foo2 !=null && foo1.Bar1.Foo2.Bar2!=null)
return DoStuff(foo1.Bar1.Foo2.Bar2); //actually a logic based on the value of Bar2
else return null; 

Is there a more elegant or convenient way, to do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

森林迷了鹿 2024-12-22 13:35:42

不,不幸的是没有。我也经常希望有一个更简单的语法!

然而,我想出了一个相当不错的替代方案:创建一个空安全链辅助方法。它看起来像这样:

var bar2 = NullSafe.Chain(foo1, f1=>f1.Bar1, b1=>b1.Foo2, f2=>f2.Bar2);

这是方法:

public static TResult Chain<TA,TB,TC,TResult>(TA a, Func<TA,TB> b, Func<TB,TC> c, Func<TC,TResult> r) 
where TA:class where TB:class where TC:class {
    if (a == null) return default(TResult);
    var B = b(a);
    if (B == null) return default(TResult);
    var C = c(B);
    if (C == null) return default(TResult);
    return r(C);
}

我还创建了一堆重载(带有 2 到 6 个参数)。这对我来说真的很有效!

No, unfortunately there isn't. I too have often wished for a simpler syntax!

However, here's a pretty decent alternative that I came up with: create an Null-Safe-Chain helper method. Here's what it looks like:

var bar2 = NullSafe.Chain(foo1, f1=>f1.Bar1, b1=>b1.Foo2, f2=>f2.Bar2);

Here's the method:

public static TResult Chain<TA,TB,TC,TResult>(TA a, Func<TA,TB> b, Func<TB,TC> c, Func<TC,TResult> r) 
where TA:class where TB:class where TC:class {
    if (a == null) return default(TResult);
    var B = b(a);
    if (B == null) return default(TResult);
    var C = c(B);
    if (C == null) return default(TResult);
    return r(C);
}

I also created a bunch of overloads (with 2 to 6 parameters). This works really well for me!

尴尬癌患者 2024-12-22 13:35:42

这个扩展方法有效,但不是很酷的代码,或者可能可以改进它:

public static bool AnyNull<TSource, TResult>(this TSource source, Func<TSource, TResult> selector)
        {
            try
            {
                selector(source);
                return false; ;
            }
            catch { return true; }
        }

使用它:

if(!foo1.AnyNull(p=>p.Bar1.Foo2.Bar2))
    DoStuff(foo1.Bar1.Foo2.Bar2)

this extention method work but is not cool code or may be can improve it:

public static bool AnyNull<TSource, TResult>(this TSource source, Func<TSource, TResult> selector)
        {
            try
            {
                selector(source);
                return false; ;
            }
            catch { return true; }
        }

use it:

if(!foo1.AnyNull(p=>p.Bar1.Foo2.Bar2))
    DoStuff(foo1.Bar1.Foo2.Bar2)
忆依然 2024-12-22 13:35:41

不,没有。

唯一可能有帮助的是评估 DoStuff 是否确实在正确的类中定义。

No, there isn't.

The only thing that might help, is to evaluate if DoStuff is actually defined in the right class.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文