2011-03-09 60 views
8

我已經找到了,這是可以設置使用反射屬性的值:Set object property using reflection反思 - 設置對象屬性考慮數據類型

但我的問題是,我的數據只存在串。因此,我總是會得到一個例外,因爲它不是正確的類型。

是否有自動嘗試將字符串解析爲相應類型(DateTime,int,decimal,float)的方法?

下面是我正在使用的代碼:

Type myType = obj.GetType(); 
PropertyInfo[] props = myType.GetProperties(); 

foreach (PropertyInfo prop in props) 
{ 
    setProperty(obj, prop, data[prop.Name]); 
} 

data是包含數據作爲字符串的簡單關聯數組。這些數據應該被映射到obj

回答

15

可以使用Convert類:

var value = Convert.ChangeType(data[prop.Name], prop.PropertyType); 
    setProperty(obj, prop, value); 
+0

哇,這很簡單!感謝您的幫助。 – Towa 2011-03-09 17:46:41

0

可以使用TypeConverter classSystem.ComponentModel

foreach (PropertyInfo prop in props) 
{ 
    var value = data[prop.Name]; 
    prop.SetValue(obj, TypeConverter.ConvertTo(value, prop.PropertyType), null); 
} 
8

您應該能夠使用TypeConverter

var converter = TypeDescriptor.GetConverter(prop.PropertyType); 
var value = converter.ConvertFromString(data[prop.Name]); 
setProperty(obj,prop,value); 
0
PropertyInfo[] Properties = typeof(InvoiceLineItemSummary).GetProperties();  

      foreach (PropertyInfo objProperty in Properties) 
      { 
        if (columns.ConvertAll(column=>column.ToLower()).Contains(objProperty.Name.ToLower())) 
        { 
         if (Nullable.GetUnderlyingType(objProperty.PropertyType) != null) 
         { 
          if (Nullable.GetUnderlyingType(objProperty.PropertyType).ToString() == "System.Decimal") 
           vm.InvoiceLineItemSummaries.ToList().ForEach(val => val.GetType().GetProperty(objProperty.Name).SetValue(val, Math.Round(Convert.ToDecimal(val.GetType().GetProperty(objProperty.Name).GetValue(val, null)), 2), null)); 

         } 
         else if(objProperty.PropertyType.ToString() == "System.Decimal") 
          vm.InvoiceLineItemSummaries.ToList().ForEach(val => val.GetType().GetProperty(objProperty.Name).SetValue(val, Math.Round(Convert.ToDecimal(val.GetType().GetProperty(objProperty.Name).GetValue(val, null)), 2), null)); 
        } 
      } 


//vm.InvoiceLineItemSummary is List of classobject 
//InvoiceLineItemSummary is class