2011-03-09 61 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