как установить nullable тип с помощью отражательного кода (c#)?

21
задан Ryan Gates 14 February 2013 в 15:21
поделиться

4 ответа

  1. Один способ сделать это:

    type.GetGenericTypeDefinition() == typeof(Nullable<>)
    
  2. Просто набор согласно любому другому отражательному коду:

    propertyInfo.SetValue(yourObject, yourValue);
    
14
ответ дан 29 November 2019 в 20:39
поделиться

Почему необходимо знать, nullable ли это? И Вы имеете в виду "ссылочный тип", или" Nullable<T>"?

Так или иначе, со строковыми значениями, самая легкая опция была бы через эти TypeConverter, который является больше легко (и более точно) доступный на PropertyDescriptor:

PropertyDescriptorCollection props = TypeDescriptor.GetProperties(obj);
// then per property...
PropertyDescriptor prop = props[propName];
prop.SetValue(obj, prop.Converter.ConvertFromInvariantString(value));

Это должно использовать корректный преобразователь, даже если установленный на свойство (а не на тип). Наконец при выполнении большого количества этого это допускает ускорение через HyperDescriptor , не изменяя код (кроме включить его для типа, сделанного однажды только).

14
ответ дан 29 November 2019 в 20:39
поделиться

Я создал небольшую выборку. Если у Вас есть какие-либо вопросы относительно этого кода, добавьте комментарии.

РЕДАКТИРОВАНИЕ : обновленный образец на основе замечательного комментария Marc Gravell

class Program
{
    public int? NullableProperty { get; set; }

    static void Main(string[] args)
    {
        var value = "123";
        var program = new Program();
        var property = typeof(Program).GetProperty("NullableProperty");

        var propertyDescriptors = TypeDescriptor.GetProperties(typeof(Program));
        var propertyDescriptor = propertyDescriptors.Find("NullableProperty", false);
        var underlyingType =  
            Nullable.GetUnderlyingType(propertyDescriptor.PropertyType);

        if (underlyingType != null)
        {
            var converter = propertyDescriptor.Converter;
            if (converter != null && converter.CanConvertFrom(typeof(string)))
            {
                var convertedValue = converter.ConvertFrom(value);
                property.SetValue(program, convertedValue, null);
                Console.WriteLine(program.NullableProperty);
            }
        }

    }
}
3
ответ дан 29 November 2019 в 20:39
поделиться

Проверка типы Nullable является легкой, международной? на самом деле System.Nullable<System.Int32>. Таким образом, Вы просто проверяете, является ли тип универсальным экземпляром System.Nullable<T>. Установка не должна иметь значения, nullableProperty.SetValue(instance, null) или nullableProperty.SetValue(instance, 3)

0
ответ дан 29 November 2019 в 20:39
поделиться
Другие вопросы по тегам:

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