PropertyInfo SetValue и аннулирует

Если у меня есть что-то как:

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" тип (Nullable<> или ссылка). Я использую Отражение, таким образом, я не знаю тип заранее. Как я пошел бы о выполнении этого?

10
задан Nelson Rothermel 14 December 2011 в 16:15
поделиться

2 ответа

Если у вас есть PropertyInfo , вы можете проверить .PropertyType ; если .IsValueType истинно, и если Nullable.GetUnderlyingType (property.PropertyType) имеет значение NULL, то это тип значения, не допускающий значения NULL:

        if (value == null && property.PropertyType.IsValueType &&
            Nullable.GetUnderlyingType(property.PropertyType) == null)
        {
            throw new InvalidCastException ();
        }
12
ответ дан 3 December 2019 в 23:48
поделиться

Вы можете использовать выражение 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 для записи конвертируемых ценности к собственности.

1
ответ дан 3 December 2019 в 23:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: