Я использую отражение для заполнения свойств объекта.
Эти свойства имеют разные типы: 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);
}
}
Спасибо, Стефано