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

Fel*_*ano 162 c# generics nullable

为了检查a Type(propertyType)是否可以为空,我正在使用:

bool isNullable =  "Nullable`1".Equals(propertyType.Name)
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 330

绝对 - 使用Nullable.GetUnderlyingType:

if (Nullable.GetUnderlyingType(propertyType) != null)
{
    // It's nullable
}
Run Code Online (Sandbox Code Playgroud)

请注意,这使用非泛型静态类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...
Run Code Online (Sandbox Code Playgroud)

  • @Askolein:我对此表示怀疑 - 我怀疑我在不到一分钟内编写了一个简短的版本,然后在接下来的五分钟内对其进行了编辑.(作者在前五分钟内的编辑不会公开记录.) (7认同)
  • @ELMOJO 为什么你会这么期待?字符串不是可为空的值类型。 (3认同)
  • @BojidarStanchev:但这不是一个可以为空的*值*类型。(在启用可为空引用类型的 C# 8 中,它甚至不是可为空类型:) 再说一次,我会知道什么 - 我在 C# 中一直使用 `var`,这与您的个人资料中隐含的建议相反。到目前为止似乎还没有损害我的职业生涯。 (3认同)
  • @BojidarStanchev:我可以看到它可能会引起混乱。但是,当我明确使用短语“字符串不是可为空的值类型”时,试图通过“删除短语的一部分”来反驳这一点感觉就像是一个容易犯的错误,也不会犯。每当我要声称某人不正确时,我都会在发布之前仔细检查。我认为这通常是一个好主意,它可以避免类似的情况。(就 var 而言,我的观点是 var 并没有损害我的职业生涯*与你的简历中隐含的讽刺相反*。) (3认同)
  • @JonSkeet 是的,我在输入大约 15 分钟后意识到这一点。推理中的瞬间失误之一。 (2认同)

VS1*_*VS1 40

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

if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) {…}
Run Code Online (Sandbox Code Playgroud)

在下面的MSDN链接中解释:

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

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

如何检查对象是否可以为空?