今天真是难住我了。我相信这并不难,但我有一个System.Reflection.PropertyInfo对象。我想根据数据库查找的结果设置它的值(想想ORM,将一个列Map回一个属性)。
我的问题是,如果DB返回的值是DBNull,我只想将属性值设置为默认值,就像调用:
value = default(T); // where T is the type of the property.
字符集
然而,如果你给予default()方法一个Type,它将无法编译,这就是我所拥有的:
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);
型
上面的代码无法编译。default(Type)无效。我也想过要做:
object myObj = ???;
PropertyInfo myPropInf = ???;
myPropInf.SetValue(myObj, Activator.CreateInstance(myPropInf.PropertyType), null);
型
但是,如果Type是string,则会分配值“new String()",但我真正想要的是“null”,这是“default(string)”将返回的值。
我错过了什么?我想一个非常古怪的方法是创建一个myObj的Type的新示例并复制该属性,但这似乎很愚蠢…
object myObj = ???;
PropertyInfo myPropInf = ???;
var blank = Activator.CreateInstance(myObj.GetType());
object defaultValue = myPropInf.GetValue(blank, null);
myPropInf.SetValue(myObj, defaultValue, null);
型
我不想浪费内存来创建一个全新的示例,只是为了获取属性的默认值。似乎很浪费。
有什么想法吗?
6条答案
按热度按时间6kkfgxo01#
我知道这是一个老职位,但我喜欢这个扭曲的达林季米特洛夫的答案。它首先检查所有DefaultValue属性,然后使用Darin Dimitrov's answer:
字符集
gdx19jrr2#
这是一个更完善的版本,它保留了.NET运行时的功能,而没有添加任何不必要的自定义代码。
注意:此代码是为.NET 3.5 SP1编写的
字符集
}
用途:
型
Rashad里维拉(OmegusPrime.com)
unhi4e5o3#
我相信只要你这么做
字符集
如果它是valuetype,它会将其设置为默认值,如果它是引用类型,它会将其设置为null。
mf98qq944#
字符集
ohfgkhjo5#
“null”技巧将它设置为类型的零值,这不一定与属性的默认值相同。首先,如果它是一个新的对象,为什么不干脆不去管它呢?或者,使用
TypeDescriptor
:字符集
这既尊重
[DefaultValue]
模式,也尊重Reset{name}()
模式(如绑定和序列化所使用的),使其非常通用和可重用。如果你做了很多这样的事情,你也可以使用
TypeDescriptor
而不是反射,通过重用PropertyDescriptorCollection
和使用HyperDescriptor来获得性能提升(相同的代码,但是比反射或原始TypeDescriptor
快得多)。f5emj3cl6#
尝试以下方法,我已经编写并测试了数千种类型:
字符集
GetDefault的第一个(通用)版本对于C#来说当然是多余的,因为你可以只使用default(T)关键字。
好好享受吧!