2009-05-14 2 views
6

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

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

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

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

(в действительности есть около дюжины свойств) и словарь будет иметь записи, как < «Описание», «Описание»> < "Id", 123456> < "Евросупер", 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); 
      } 
     } 

Спасибо, Стефано

ответ

10

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

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

Type propertyType = info.PropertyType; 
if (thisPropertyValue != null) 
{ 
    Type underlyingType = Nullable.GetUnderlyingType(propertyType); 
    thisPropertyValue = Convert.ChangeType(
     thisPropertyValue, underlyingType ?? propertyType); 
} 
info.SetValue(this, thisPropertyValue, null); 
+0

Я собирался предложить просто пытаюсь info.SetValue (this, thisPropertyValue, null); но это кажется лучшим решением. – ChrisF

+0

+1 для метода Convert.ChangeType. Это отличное решение, чтобы избежать ifs в коде. –

+0

@Marc: Спасибо, это сделал трюк;) @ ChrisF: info.SetValue (this, thisPropertyValue, null) вызвал исключение при попытке конвертировать из int в double в одном из моих тестовых случаев. –

Смежные вопросы