This is really stumping me today. I’m sure its not that hard, but I have a System.Reflection.PropertyInfo object. I want to set its value based on the result of a database lookup (think ORM, mapping a column back to a property).
My problem is if the DB returned value is DBNull, I just want to set the property value to its default, the same as calling:
value = default(T); // where T is the type of the property.
However, the default() method won’t compile if you give it a Type, which is what I have:
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);
The above doesn’t compile. default(Type) is invalid. I also thought about doing:
object myObj = ???; PropertyInfo myPropInf = ???; myPropInf.SetValue(myObj, Activator.CreateInstance(myPropInf.PropertyType), null);
However, if the Type is string, that would assign the value ‘new String()’, but I really want ‘null’, which is what ‘default(string)’ would return.
So what am I missing here? I suppose a really hacky way would be to create a new instance of myObj’s Type and copy the property over, but that just seems stupid…
object myObj = ???; PropertyInfo myPropInf = ???; var blank = Activator.CreateInstance(myObj.GetType()); object defaultValue = myPropInf.GetValue(blank, null); myPropInf.SetValue(myObj, defaultValue, null);
I’d rather not waste the memory to make a whole new instance, just to get the default for the property though. Seems very wasteful.
Any ideas?
I believe if you just do
If it’s a valuetype, it’ll set it to the default value, if it’s a reference type, it’ll set it to null.