检查类型是否为Nullable的正确方法

时间:2012-01-20 10:26:20

标签: c# generics nullable

为了检查TypepropertyType)是否可以为空,我正在使用:

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

有没有办法避免使用魔术字符串?

2 个答案:

答案 0 :(得分:305)

绝对 - 使用Nullable.GetUnderlyingType

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

请注意,这使用非泛型静态类System.Nullable而不是通用结构Nullable<T>

另请注意,这将检查它是否代表特定的(已关闭)可空值类型...如果您在通用类型上使用它,它将无效,例如

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...

答案 1 :(得分:36)

使用以下代码确定Type对象是否表示Nullable类型。请记住,如果从对GetType的调用返回Type对象,则此代码始终返回false。

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

在下面的MSDN链接中解释:

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

此外,在此SO QA上也有类似的讨论:

How to check if an object is nullable?