Я использую отражение, чтобы заполнить свойства объекта.
Эти свойства имеют разные типы: String, Nullable (double) и Nullable (long) (здесь не знаю, как избежать угловых скобок ...). Значения этих свойств поступают из словаря пар (строка, объект).
Так, например, у моего класса есть следующие свойства:
string Description { get; set; }
Nullable<long> Id { get; set; }
Nullable<double> MaxPower { get; set; }
(в действительности существует около дюжины свойств), и в словаре будут такие записи, как <"Description", "A description">, <"Id", 123456>, <"MaxPower", 20000>
Теперь я использую что-то вроде следующего для установки значений:
foreach (PropertyInfo info in this.GetType().GetProperties())
{
if (info.CanRead)
{
object thisPropertyValue = dictionary[info.Name];
if (thisPropertyValue != null && info.CanWrite)
{
Type propertyType = info.PropertyType;
if (propertyType == typeof(String))
{
info.SetValue(this, Convert.ToString(thisPropertyValue), null);
}
else if (propertyType == typeof(Nullable<double>))
{
info.SetValue(this, Convert.ToDouble(thisPropertyValue), null);
}
else if (propertyType == typeof(Nullable<long>))
{
info.SetValue(this, Convert.ToInt64(thisPropertyValue), null);
}
else
{
throw new ApplicationException("Unexpected property type");
}
}
}
}
Итак, вопрос: действительно ли мне нужно проверять тип каждого свойства перед присвоением значения? Есть ли что-то похожее на приведение, которое я могу выполнить, чтобы значению свойства был присвоен тип соответствующего свойства?
В идеале я хотел бы иметь возможность сделать что-то , например , следующее (что, как я наивно думал, могло бы сработать):
if (thisPropertyValue != null && info.CanWrite)
{
Type propertyType = info.PropertyType;
if (propertyType == typeof(String))
{
info.SetValue(this, (propertyType)thisPropertyValue, null);
}
}
Спасибо,
Stefano