1

私のコードでは、いくつかのプロパティ ゲッターを呼び出して値にアクセスする必要があります。

IFoo1 a = objA.Prop1.Value;
IFoo2 b = objB.Prop2.Prop3.Value;
IFoo3 c = objC.Prop4.Prop5.Prop6.Value;

すべてのプロパティは null にすることができます。したがって、すべての値にアクセスするには、ネストされた if ブロックを使用する必要があります。

IFoo2 b = null;

if(objB.Prop2!=null)
{
    if(objB.Prop2.Prop3!=null)
    {
         b = objB.Prop2.Prop3.Value;
    }
}

このコードを改善して、if ブロックの量を減らすにはどうすればよいですか? ラムダ式、LINQ、IExpression などを使用して、何らかの方法で次のものに置き換えることはできますか。

IFoo2 b = GetVal(objB.Prop2.Prop3.Value);

すべての PropX はさまざまなタイプであり、私はそのようなプロパティを何百も持っています。.NET 3.5 または少なくとも .NET 4.0 を使用する必要があります。それ以降のバージョンは使用できません。

重要な編集:

Visual Studio 2012 および 2013 も使用する必要があります。VS 2015 をターゲットにすることはできません。

4

4 に答える 4

0

おそらくできる最善のことは、次のifような複合条件を使用することです

IFoo2 b = null;

if(objB.Prop2 != null && objB.Prop2.Prop3 != null)
{ 
  b = objB.Prop2.Prop3.Value;
}

(または) Ternary Operatorlikeを使用する

IFoo2 b = (objB.Prop2 != null && objB.Prop2.Prop3 != null) ? objB.Prop2.Prop3.Value : null;
于 2015-09-03T23:10:05.097 に答える
-1

.NET 4.6 には ? が追加されました。この正確な問題を解決する演算子。

http://www.volatileread.com/Wiki?id=2104

これにより、このように書くことができます。

IFoo3 c = objC?.Prop4?.Prop5?.Prop6?.Value;

ヘルパー関数を作成することでこれを回避できるかもしれませんが、コードの明快さと単純さはこれに近づきません。可能であれば、アップグレードしてその機能を入手してください。

于 2015-09-03T23:09:51.070 に答える