请看以下示例:
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);
}
}
在示例中,我使用反射将int
属性设置为null
。我希望这会引发异常,因为null
不是int
的有效值。但它没有抛出,它只是将属性设置为0.为什么!?
更新
好吧,它似乎就是这样。如果您尝试将其设置为null,则该属性将获取value-type的默认值。我已经发布了一个答案,描述了我如何解决我的问题,也许有一天会帮助某人。感谢所有回答的人。
答案 0 :(得分:8)
答案 1 :(得分:6)
设置类型的默认值。 documentation之前未提及此行为,但现在是:
如果此PropertyInfo对象是值类型且值为null,则 该属性将设置为该类型的默认值。
答案 2 :(得分:2)
SetValue(或者可能是默认的绑定器)的行为似乎有点危险,Code等于这解决了我的问题:
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);
}
}
}
也许有一天它会帮助某人......