3

変数プロパティ情報を単純な文字列にダンプしようとしていますが、null 許容ブールas string値に到達すると、実際の値が true であっても常に null が返されます | 間違い!

StringBuilder propertyDump = new StringBuilder();

foreach(PropertyInfo property in typeof(MyClass).GetProperties())
{
    propertyDump.Append(property.Name)
                .Append(":")
                .Append(property.GetValue(myClassInstance, null) as string);
}

return propertyDump.ToString();

例外はスローされません。bool?迅速で、常にfalseであるプロパティを除いて、出力はまさに私が望むものです。私がすばやく見て実行すると、うまくいき.ToString()ます!しかし、他のプロパティが実際に null でないことは保証できません。

これがなぜなのか説明できる人はいますか?さらに良いことに、回避策はありますか?

4

6 に答える 6

5

boolは文字列ではないため、ボックス化されたブール値を渡すと、as演算子はnullを返します。

あなたの場合、あなたは次のようなものを使うことができます:

object value = property.GetValue(myClassInstance, null);

propertyDump.Append(property.Name)
            .Append(":")
            .Append(value == null ? "null" : value.ToString());

テキストを追加せずにnull値を使用したい場合は、Append(Object)を直接使用できます。

propertyDump.Append(property.Name)
            .Append(":")
            .Append(property.GetValue(myClassInstance, null));

これは機能しますが、「propertyDump」出力にnullプロパティを欠落したエントリとして残します。

于 2012-06-12T20:39:04.680 に答える
4

インスタンスがそのas正確なタイプである場合、またはそれ以外の場合、演算子はキャストされた値を返しますnull

代わりに、あなたはただすべき.Append(property.GetValue(...))です; Append()nullと変換を自動的に処理します。

于 2012-06-12T20:39:00.277 に答える
2

私の意見では、最も良い解決策は次のとおりです。

.Append(property.GetValue(myClassInstance, null) ?? "null");

値が null の場合は「null」を追加し、そうでない場合は値の ToString を呼び出して追加します。

これを foreach ループの代わりに Linq と組み合わせると、ちょっとした素敵なことができます。

var propertyDump =
    string.Join(Environment.NewLine,
                typeof(myClass).GetProperties().Select(
                    pi => string.Format("{0}: {1}",
                                        pi.Name,
                                        pi.GetValue(myClassInstance, null) ?? "null")));

(VSのワイド画面の方が見栄えがします)。

ちなみに、速度を比較すると、string.Join は StringBuilder に追加するよりも高速であることが判明したため、このソリューションを参照することをお勧めします。

于 2012-06-12T20:49:57.577 に答える
1

これは、プロパティの型が文字列ではないためです。次のように変更します。

Convert.ToString(property.GetValue(myClassInstance, null))

null の場合は、null を取得するので問題ありません。null 以外の値の場合、プロパティの値の文字列表現を返します。

于 2012-06-12T20:40:26.283 に答える
0

文字列にブール値をキャストすることはできません。使用する必要がありますToString()

于 2012-06-12T20:38:54.320 に答える
0

Null 合体演算子を使用して、Null の状況を処理します。

void Main()
{

   TestIt tbTrue = new TestIt() { BValue = true }; // Comment out assignment to see null

   var result =
    tbTrue.GetType()
          .GetProperties()
          .FirstOrDefault( prp => prp.Name == "BValue" )
          .GetValue( tb, null ) ?? false.ToString();

      Console.WriteLine ( result ); // True

}

public class TestIt
{
   public bool? BValue { get; set; }
}
于 2012-06-12T20:51:43.947 に答える