Reflection - установить свойство объекта с учетом типа данных - PullRequest
8 голосов
/ 09 марта 2011

Я уже обнаружил, что можно установить значение свойства с помощью отражения: Установить свойство объекта с помощью отражения

Но моя проблема в том, что мои данные существуют только в виде строки. Поэтому, конечно, я всегда получаю исключение, потому что это неправильный тип.

Есть ли способ автоматической попытки анализа строки в соответствии с типом (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 ]

15 голосов
/ 09 марта 2011

Вы можете использовать Convert класс:

   var value = Convert.ChangeType(data[prop.Name], prop.PropertyType);
   setProperty(obj, prop, value);
8 голосов
/ 09 марта 2011

Вы должны быть в состоянии использовать TypeConverter:

var converter = TypeDescriptor.GetConverter(prop.PropertyType);
var value = converter.ConvertFromString(data[prop.Name]);
setProperty(obj,prop,value);
0 голосов
/ 04 января 2012
  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
0 голосов
/ 09 марта 2011

Вы можете использовать TypeConverter класс в System.ComponentModel:

foreach (PropertyInfo prop in props)
{
    var value = data[prop.Name];
    prop.SetValue(obj, TypeConverter.ConvertTo(value, prop.PropertyType), null);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...