Один способ сделать это:
type.GetGenericTypeDefinition() == typeof(Nullable<>)
Просто набор согласно любому другому отражательному коду:
propertyInfo.SetValue(yourObject, yourValue);
Почему необходимо знать, 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
, не изменяя код (кроме включить его для типа, сделанного однажды только).
Я создал небольшую выборку. Если у Вас есть какие-либо вопросы относительно этого кода, добавьте комментарии.
РЕДАКТИРОВАНИЕ : обновленный образец на основе замечательного комментария 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);
}
}
}
}
Проверка типы Nullable является легкой, международной? на самом деле System.Nullable<System.Int32>
. Таким образом, Вы просто проверяете, является ли тип универсальным экземпляром System.Nullable<T>
. Установка не должна иметь значения, nullableProperty.SetValue(instance, null)
или nullableProperty.SetValue(instance, 3)