2009-09-04 1 views
4

見て:リフレクションを使用して値の型をnullに設定すると、奇妙な動作が発生します。なぜですか?次の例で

public class Test { 
    public int Number { get; set; } 
    public void TestReflection() { 
     Number = 99; 
     Type type = GetType(); 
     PropertyInfo propertyInfo = type.GetProperty("Number"); 
     propertyInfo.SetValue(this, null, null); 
    } 
} 

の例では、私は、リフレクションを使用してnullintプロパティを設定しています。 nullintの有効な値ではないため、例外をスローすることを期待していました。しかし、それはスローされません、それはちょうど0にプロパティを設定します。なぜ!

更新

[OK]を、それはそれがどれだけあるようです。このプロパティは、nullに設定しようとすると、value-typeのデフォルト値を取得します。私は自分の問題をどのように解決したのかを記述した回答を掲載しました。多分いつか誰かを助けるでしょう。答えたすべての人に感謝します。

答えて

6

タイプのデフォルト値を設定します。この動作は、前documentationに言及したが、今ではありませんした

このPropertyInfoオブジェクトがプロパティは、その型のデフォルト値に設定され、その後 、値の型と値がnullの場合。

8

おそらくタイプのデフォルト値に設定されています。 Boolもおそらく偽になるでしょう、私は期待しています。使用するのと同じ

は:

default(int); 

私はMSDN default keyword in C#からいくつかのドキュメントを見つけました。

2

のSetValue(または多分デフォルトバインダー)の動作は少し危険なようで、これと同等のコードは私の問題を解決しました:

public class Test { 
    public int Number { get; set; } 
    public void SetNumberUsingReflection(object newValue) { 
     Number = 99; 
     Type type = GetType(); 
     PropertyInfo propertyInfo = type.GetProperty("Number"); 
     if(propertyInfo.PropertyType.IsValueType && newValue == null) { 
      throw new InvalidOperationException(String.Format("Cannot set a property of type '{0}' to null.", propertyInfo.PropertyType)); 
     } else { 
      propertyInfo.SetValue(this, newValue, null); 
     } 
    } 
} 

多分それは...いつか

を誰かを助けます
関連する問題