Это действительно ставит меня в тупик сегодня. Я уверен, что это не так сложно, но у меня есть объект System.Reflection.PropertyInfo. Я хочу установить его значение на основе результата поиска в базе данных (например, ORM, сопоставление столбца со свойством).
Моя проблема в том, что если возвращаемым значением БД является DBNull, я просто хочу установить для свойства значение по умолчанию, так же, как при вызове:
value = default(T); // where T is the type of the property.
Однако метод 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);
Выше не компилируется. по умолчанию (тип) является недействительным. Я тоже думал о выполнении:
object myObj = ???;
PropertyInfo myPropInf = ???;
myPropInf.SetValue(myObj, Activator.CreateInstance(myPropInf.PropertyType), null);
Однако, если Type является строкой, это присвоит значение «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);
Я бы предпочел не тратить память на создание совершенно нового экземпляра, просто чтобы получить значение по умолчанию для этого свойства. Кажется очень расточительным.
Есть идеи?