Правильный способ проверить, является ли тип Nullable

Чтобы проверить, является ли значение Type (propertyType) нулевым, я использую:

bool isNullable =  "Nullable`1".Equals(propertyType.Name)

Есть ли способ избежать использования магических строк?

Ответ 1

Абсолютно - используйте Nullable.GetUnderlyingType:

if (Nullable.GetUnderlyingType(propertyType) != null)
{
    // It nullable
}

Обратите внимание, что это использует не общий родовой статический класс System.Nullable, а не общую конструкцию Nullable<T>.

Также обратите внимание, что это проверит, представляет ли он конкретный (закрытый) тип значения NULL... он не будет работать, если вы используете его для общего типа, например.

public class Foo<T> where T : struct
{
    public Nullable<T> Bar { get; set; }
}

Type propertyType = typeof(Foo<>).GetProperty("Bar").PropertyType;
// propertyType is an *open* type...

Ответ 2

Используйте следующий код, чтобы определить, представляет ли объект Type объект Nullable. Помните, что этот код всегда возвращает false, если объект Type был возвращен из вызова GetType.

if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) {…}

объясняется на следующей ссылке MSDN:

http://msdn.microsoft.com/en-us/library/ms366789.aspx

Кроме того, в этом SO QA есть аналогичное обсуждение:

Как проверить, является ли объект допустимым?