IsPrimitive不包含可空的原始值

时间:2014-01-07 14:16:00

标签: c# types primitive

我想检查Type是否是原始的,并使用以下代码:

return type.IsValueType && type.IsPrimitive;

只要原语不可为空,这就可以正常工作。例如int ?,如何检查类型是否为可为空的原始类型? (仅供参考:type.IsPrimitive == false对于int?)

3 个答案:

答案 0 :(得分:15)

来自MSDN:

  

基元类型是布尔,字节,SByte,Int16,UInt16,Int32,   UInt32,Int64,UInt64,IntPtr,UIntPtr,Char,Double和Single。

所以基本上你应该期望Nullable<Int32> 是原始类型。

您可以使用Nullable.GetUnderlyingTypeInt32“提取”Nullable<Int32>

答案 1 :(得分:6)

首先,您需要确定它是否为Nullable<>,然后您需要获取可空类型:

if (type.IsGenericType
    && type.GetGenericTypeDefinition() == typeof(Nullable<>)
    && type.GetGenericArguments().Any(t => t.IsValueType && t.IsPrimitive))
{
    // it's a nullable primitive
}

现在,上述工作,但不是递归。为了让它以递归方式工作,你需要将它放入一个方法,你可以递归调用GetGenericArguments中的所有类型。但是,如果没有必要,请不要这样做。

该代码也可以转换为:

if (type.GetGenericArguments().Any(t => t.IsValueType && t.IsPrimitive))
{
    // it's a nullable primitive
}

但需要注意的是,它可能是一个通用的引用类型,并且可能无法满足您的需要原始的定义。再次,请记住,前面提到的更简洁但可以返回误报。

答案 2 :(得分:2)

IsPrimitive Nullable<int>(也称为int?)失败的原因是Nullable<int>不是原语。它是泛型类Nullable<T>的一个实例,其类型参数为int

您可以通过验证

来检查数字是否为可以为空的原语
  • 这是一种通用类型,
  • 其通用类型定义为Nullable<>
  • 其通用参数类型IsPrimitive