Установка свойств объекта через отражение с различными типами свойств - PullRequest
6 голосов
/ 14 мая 2009

Я использую отражение, чтобы заполнить свойства объекта.

Эти свойства имеют разные типы: String, Nullable (double) и Nullable (long) (здесь не знаю, как избежать угловых скобок ...). Значения этих свойств поступают из словаря пар (строка, объект).

Так, например, у моего класса есть следующие свойства:

string Description { get; set; } 
Nullable<long> Id { get; set; }
Nullable<double> MaxPower { get; set; }

(в действительности существует около дюжины свойств), и в словаре будут такие записи, как <"Description", "A description">, <"Id", 123456>, <"MaxPower", 20000>

Теперь я использую что-то вроде следующего для установки значений:

foreach (PropertyInfo info in this.GetType().GetProperties())
{
    if (info.CanRead)
    {
         object thisPropertyValue = dictionary[info.Name];

         if (thisPropertyValue != null && info.CanWrite)
         {
             Type propertyType = info.PropertyType;

             if (propertyType == typeof(String))
             {
                 info.SetValue(this, Convert.ToString(thisPropertyValue), null);
             }
             else if (propertyType == typeof(Nullable<double>))
             {
                 info.SetValue(this, Convert.ToDouble(thisPropertyValue), null);
             }
             else if (propertyType == typeof(Nullable<long>))
             {
                 info.SetValue(this, Convert.ToInt64(thisPropertyValue), null);
             }
             else
             {
                 throw new ApplicationException("Unexpected property type");
             }
         }
     }
}

Итак, вопрос: действительно ли мне нужно проверять тип каждого свойства перед присвоением значения? Есть ли что-то похожее на приведение, которое я могу выполнить, чтобы значению свойства был присвоен тип соответствующего свойства?

В идеале я хотел бы иметь возможность сделать что-то , например , следующее (что, как я наивно думал, могло бы сработать):

         if (thisPropertyValue != null && info.CanWrite)
         {
             Type propertyType = info.PropertyType;

             if (propertyType == typeof(String))
             {
                 info.SetValue(this, (propertyType)thisPropertyValue, null);
             }
        }

Спасибо, Stefano

1 Ответ

10 голосов
/ 14 мая 2009

Если значения уже имеют правильный тип, то нет: вам не нужно ничего делать. Если они могут быть не правы (int или float и т. Д.), Простой подход может быть следующим:

( редактировать с поправкой на ноль)

Type propertyType = info.PropertyType;
if (thisPropertyValue != null)
{
    Type underlyingType = Nullable.GetUnderlyingType(propertyType);
    thisPropertyValue = Convert.ChangeType(
        thisPropertyValue, underlyingType ?? propertyType);
}
info.SetValue(this, thisPropertyValue, null);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...