【问题标题】:Reflection - set object property considering data type反射 - 考虑数据类型设置对象属性
【发布时间】:2011-03-09 00:21:20
【问题描述】:

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

【问题讨论】:

    标签: c# .net reflection


    【解决方案1】:

    您可以使用Convert 类:

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

    【讨论】:

    • 哇,这太简单了!感谢您的帮助。
    【解决方案2】:

    你应该可以使用TypeConverter:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:
          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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-10-11
          • 2010-10-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-11-02
          • 1970-01-01
          相关资源
          最近更新 更多