.NET - 如何获取反射PropertyInfo的默认值?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (42)

今天我真的很难过。我确定它不那么难,但我有一个System.Reflection.PropertyInfo对象。我想根据数据库查找的结果设置它的值(想想ORM,将列映射回属性)。

我的问题是,如果数据库返回值是DBNull,我只想将属性值设置为其默认值,与调用相同:

value = default(T);  // where T is the type of the property.

然而,如果你给它一个Type,那么default()方法就不会编译,这就是我所拥有的:

object myObj = ???; // doesn't really matter. some arbitrary class.
PropertyInfo myPropInf = ???; // the reflection data for a property on the myObj object.
myPropInf.SetValue(myObj, default(myPropInf.PropertyType), null);

以上不编译。默认(Type)无效。我也想过这样做:

object myObj = ???;
PropertyInfo myPropInf = ???;
myPropInf.SetValue(myObj, Activator.CreateInstance(myPropInf.PropertyType), null);

然而,如果类型是字符串,那将会赋值“new String()”,但我真的想要“null”,这就是“default(string)”会返回的值。

那么我在这里错过了什么?我想一个非常冒险的方法是创建一个myObj类型的新实例并复制该属性,但这看起来很愚蠢......

object myObj = ???;
PropertyInfo  myPropInf = ???;
var blank = Activator.CreateInstance(myObj.GetType());
object defaultValue = myPropInf.GetValue(blank, null);
myPropInf.SetValue(myObj, defaultValue, null);

我宁愿不浪费内存来创建一个全新的实例,只是为了获得属性的默认值。看起来非常浪费。

有任何想法吗?

提问于
用户回答回答于

我相信如果你只是这样做

prop.SetValue(obj,null,null);

如果它是一个值类型,它会将其设置为默认值,如果它是引用类型,则将其设置为null。

用户回答回答于
object defaultValue = type.IsValueType ? Activator.CreateInstance(type) : null;

扫码关注云+社区