反射 - 考虑数据类型设置对象属性

时间:2011-03-09 00:21:21

标签: c# .net reflection

我已经发现可以使用反射设置属性的值: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

4 个答案:

答案 0 :(得分:15)

您可以使用Convert类:

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

答案 1 :(得分:8)

您应该可以使用TypeConverter

var converter = TypeDescriptor.GetConverter(prop.PropertyType);
var value = converter.ConvertFromString(data[prop.Name]);
setProperty(obj,prop,value);

答案 2 :(得分:0)

您可以使用System.ComponentModel中的TypeConverter class

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

答案 3 :(得分: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