簡體   English   中英

反射 - 考慮數據類型設置對象屬性

[英]Reflection - set object property considering data type

我已經發現可以使用反射設置屬性的值:使用反射設置對象屬性

但我的問題是我的數據只存在於字符串中。 因此,當然我總是得到一個例外,因為它不是正確的類型。

有沒有辦法自動嘗試將字符串解析為相應的類型(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

您可以使用Convert類:

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

您應該能夠使用TypeConverter

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

您可以在System.ComponentModel使用TypeConverter

foreach (PropertyInfo prop in props)
{
    var value = data[prop.Name];
    prop.SetValue(obj, TypeConverter.ConvertTo(value, prop.PropertyType), null);
}
  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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM