使用反射将值类型设置为null时出现奇怪的行为,为什么?

时间:2009-09-04 13:40:18

标签: c# reflection

请看以下示例:

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的默认值。我已经发布了一个答案,描述了我如何解决我的问题,也许有一天会帮助某人。感谢所有回答的人。

3 个答案:

答案 0 :(得分:8)

可能将值设置为类型的默认值。我期待,Bool可能也会变得虚假。

与使用相同:

default(int);

我在MSDN中找到了default keyword in C#的一些文档。

答案 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);
        }
    }
}

也许有一天它会帮助某人......