Есть ли лучший способ, чтобы преобразовать к конкретному типу с отражением?


Вместо того, чтобы делать то, что по сути является большой оператор switch для каждого возможного типа, есть более универсальный способ преобразования для конкретного типа с отражением? Я посмотрел класса typeconverter, но не понимают документации.

if (header.Property.PropertyType == typeof(Int32))
{
  header.Property.SetValue(instanceOfTrade, value.ToInt(), null);
}
else if (header.Property.PropertyType == typeof(decimal))
{
  header.Property.SetValue(instanceOfTrade, value.ToDecimal(), null);
}
else if (header.Property.PropertyType == typeof(DateTime))
{
  header.Property.SetValue(instanceOfTrade, value.TryToDateTime(), null);
}
else
{
  header.Property.SetValue(instanceOfTrade, value.ToString(), null);
}


9627
5
задан 27 июля 2011 в 03:07 Источник Поделиться
Комментарии
1 ответ

Вы могли бы использовать метод расширения (если это распространено), или обычный универсальный метод с "интерфейса iconvertible" ограничение на требуемое значение, затем вызвать "преобразования.Метод changetype" в вашей помощью вызова setValue.

static class ObjectExtensions
{
public static void SetPropertyValue<T>(this object obj, string propertyName, T propertyValue)
where T : IConvertible
{
PropertyInfo pi = obj.GetType().GetProperty( propertyName );

if( pi != null && pi.CanWrite )
{
pi.SetValue
(
obj,
Convert.ChangeType(propertyValue, pi.PropertyType),
null
);
}
}
}

class TestObject
{
public string Property1 { get; set; }
public int Property2 { get; set; }
}

void Main()
{
TestObject o = new TestObject();

// Propery1 == null, Property2 == 0
o.SetPropertyValue( "Property1", 1 );
o.SetPropertyValue( "Property2", "123" );
// Propery1 == 1, Property2 == 123
}

Очевидно, что нет обработки ошибок, и это при условии, что вы хотите она доступна на всех видах, так что я просто бросил его в "ObjectExtensions" класса поэтому он будет виден на всех видах.

Просто настроить ограничения, чтобы соответствовать вашим потребностям, или просто бросить его в обычный класс, если вы не хотите использовать расширения.

5
ответ дан 27 июля 2011 в 03:07 Источник Поделиться