Я использую отражение для заполнения свойств объекта.Настройка свойств объекта посредством отражения с различными типами свойств
Эти свойства имеют разные типы: String, Nullable (double) и Nullable (long) (не знаю, как избежать угловых скобок здесь ...). Значения для этих свойств исходят из словаря (строки, объекта).
Так, например, мой класс обладает следующими свойствами:
string Description { get; set; }
Nullable<long> Id { get; set; }
Nullable<double> MaxPower { get; set; }
(в действительности есть около дюжины свойств) и словарь будет иметь записи, как < «Описание», «Описание»> < "Id", 123456> < "Евросупер", 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);
}
}
Спасибо, Стефано
Я собирался предложить просто пытаюсь info.SetValue (this, thisPropertyValue, null); но это кажется лучшим решением. – ChrisF
+1 для метода Convert.ChangeType. Это отличное решение, чтобы избежать ifs в коде. –
@Marc: Спасибо, это сделал трюк;) @ ChrisF: info.SetValue (this, thisPropertyValue, null) вызвал исключение при попытке конвертировать из int в double в одном из моих тестовых случаев. –