PropertyInfo SetValue и nulls
Если у меня есть что-то вроде:
object value = null;
Foo foo = new Foo();
PropertyInfo property = Foo.GetProperties().Single(p => p.Name == "IntProperty");
property.SetValue(foo, value, null);
Затем foo.IntProperty
устанавливается в 0
, хотя value = null
. Кажется, что он делает что-то вроде IntProperty = default(typeof(int))
. Я хотел бы добавить InvalidCastException
, если IntProperty
не является "нулевым" типом (Nullable<>
или ссылкой). Я использую Reflection, поэтому я не знаю тип раньше времени. Как я могу это сделать?
Ответы
Ответ 1
Если у вас есть PropertyInfo
, вы можете проверить .PropertyType
; если .IsValueType
истинно, а если Nullable.GetUnderlyingType(property.PropertyType)
равно null, то это нечетный тип значения:
if (value == null && property.PropertyType.IsValueType &&
Nullable.GetUnderlyingType(property.PropertyType) == null)
{
throw new InvalidCastException ();
}
Ответ 2
Вы можете использовать выражение PropertyInfo.PropertyType.IsAssignableFrom(value.GetType()), чтобы определить, может ли указанное значение быть записано в свойство. Но вам нужно обрабатывать случай, когда значение равно null, поэтому в этом случае вы можете присвоить его свойству только в том случае, если тип свойства имеет значение NULL или тип свойства является ссылочным типом:
public bool CanAssignValueToProperty(PropertyInfo propertyInfo, object value)
{
if (value == null)
return Nullable.GetUnderlyingType(propertyInfo.PropertyType) != null ||
!propertyInfo.IsValueType;
else
return propertyInfo.PropertyType.IsAssignableFrom(value.GetType());
}
Кроме того, вы можете найти полезный метод Convert.ChangeType для записи конвертируемых значений в свойство.