我想检查Type是否是原始的,并使用以下代码:
return type.IsValueType && type.IsPrimitive;
只要原语不可为空,这就可以正常工作。例如int ?,如何检查类型是否为可为空的原始类型? (仅供参考:type.IsPrimitive == false
对于int?)
答案 0 :(得分:15)
来自MSDN:
基元类型是布尔,字节,SByte,Int16,UInt16,Int32, UInt32,Int64,UInt64,IntPtr,UIntPtr,Char,Double和Single。
所以基本上你应该期望Nullable<Int32>
不是原始类型。
您可以使用Nullable.GetUnderlyingType
从Int32
“提取”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
。