Это действительно потрясает меня сегодня. Я уверен, что это не так сложно, но у меня есть объект System.Reflection.PropertyInfo. Я хочу установить его значение на основе результата поиска базы данных (подумайте, что ORM, отображая столбец обратно в свойство).
Моя проблема в том, что возвращаемое значение 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 (Тип) недействителен. Я также думал о том, чтобы делать:
object myObj = ???;
PropertyInfo myPropInf = ???;
myPropInf.SetValue(myObj, Activator.CreateInstance(myPropInf.PropertyType), null);
Однако, если Type является строкой, которая присваивает значение "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);
Я бы предпочел не тратить память на создание совершенно нового экземпляра, просто чтобы получить значение по умолчанию для свойства. Кажется очень расточительным.
Любые идеи?