PropertyInfo SetValue и NULL - PullRequest
10 голосов
/ 16 июня 2010

Если у меня есть что-то вроде:

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, поэтому я не знаю тип заранее. Как бы я поступил так?

Ответы [ 2 ]

12 голосов
/ 16 июня 2010

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

        if (value == null && property.PropertyType.IsValueType &&
            Nullable.GetUnderlyingType(property.PropertyType) == null)
        {
            throw new InvalidCastException ();
        }
1 голос
/ 16 июня 2010

Вы можете использовать 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());
}

Также может оказаться полезным преобразоватьМетод .ChangeType для записи конвертируемых значений в свойство.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...