2011-11-15 10 views
3

可能性の重複:例えば
ヌルになる可能性のあるネストされたプロパティをチェックするための便利な構文はありますか?

Deep Null checking, is there a better way?

、あなたがFoo1.Bar1.Foo2.Bar2にロジックを実行している(およびプロパティのそれぞれがヌルであることができる)場合、次のことができあなたがnull参照の例外

を得ることも可能であるため、「がトンは、ちょうど現在、これは私が何をすべきかですfoo.Bar1.Foo2.Bar2にそれを行う

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; 

もっとエレガントで便利な方法がありますか?

+0

アファイック、いいえ、ありません。 – Icarus

答えて

0

いいえ、ありません。

DoStuffが正しいクラスに実際に定義されているかどうかを評価することだけが役に立ちます。

0

この拡張子方法作業が、それを改善することができますクールなコードではありませんかことがあります

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) 
+0

私はあなたの注文を正確に理解していませんが、このコードはfoo1にもnull値があっても正しく動作します –

0

いいえ、残念ながらありません。私はしばしばより単純な構文を望んでいました!

しかし、私が思いついたかなり良い選択肢は次のとおりです。Null-Safe-Chainヘルパーメソッドを作成します。ここでは次のようになります。

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パラメータを持つ)のオーバーロードの束を作成しました。これは私のために本当にうまくいく!

関連する問題