检查类型是不是为 Nullable 的正确方法 [重复]

Posted

技术标签:

【中文标题】检查类型是不是为 Nullable 的正确方法 [重复]【英文标题】:Correct way to check if a type is Nullable [duplicate]检查类型是否为 Nullable 的正确方法 [重复] 【发布时间】:2012-01-20 10:26:20 【问题描述】:

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

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

有什么方法可以避免使用魔术字符串吗?

【问题讨论】:

检查类型是否为Nullable<T>?如果是这样,请查看***.com/questions/374651/… 本题不重复。它询问类型是否可以为空(不是对象可以为空) 【参考方案1】:

绝对 - 使用 Nullable.GetUnderlyingType:

if (Nullable.GetUnderlyingType(propertyType) != null)

    // It's nullable

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

还要注意,这将检查它是否代表一个特定(封闭的)可为空的值类型...如果你在 generic 类型上使用它,它将不起作用,例如

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

【讨论】:

@Askolein:我怀疑 - 我怀疑我在不到一分钟的时间内写了一个简短的版本,然后在接下来的五分钟内对其进行了编辑。 (作者在前五分钟内的编辑不会公开记录。) @ELMOJO 为什么会这样?字符串不是可以为空的值类型。 @JonSkeet 是的,我在输入它大约 15 分钟后意识到这一点。推理中的瞬间失误之一。 @BojidarStanchev:虽然它不是可以为空的 value 类型。 (并且在启用了可空引用类型的 C# 8 中,它甚至不是可空类型 :) 再说一次,我会知道什么 - 我在 C# 中一直使用 var,这与您的个人资料中的隐含建议相反。到目前为止,似乎并没有伤害我的职业生涯。 @BojidarStanchev:我知道它可能会导致混淆。但是,当我明确使用短语“字符串不是可空值类型”时,试图通过 删除部分短语 来反驳这一点感觉就像一个简单的错误 not也要做。每当我要声称某人不正确时,我都会在发布前仔细检查。我认为这是一个普遍的好主意,它可以避免这种情况。 (就 var 而言,我的观点是 var 并没有伤害我的职业生涯与你的简历中隐含的陷阱相反。)【参考方案2】:

使用以下代码确定 Type 对象是否表示 Nullable 类型。请记住,如果 Type 对象是从对 GetType 的调用中返回的,则此代码始终返回 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?

【讨论】:

感谢您提供指向其他 SO 问题的链接。关于另一个问题的信息堆积如山。 !type.IsGenericTypeDefinition就好了。否则,typeof(Nullable&lt;&gt;) 将返回 true,这可能需要也可能不需要,只是说

以上是关于检查类型是不是为 Nullable 的正确方法 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

.NET(C#) Nullable(可空类型)通过扩展方法传委托参数调用方法

安全且正确地从 Nullable 中提取价值? [复制]

Nullable不是泛型类, 但方法可以是泛型的;

解析类型后加问号和双问号

“System.Int16”类型的对象无法转换为“System.Nullable”1[System.Int32] 类型

effectiveJava覆盖equals方法