【问题标题】:IsPrimitive doesn't include nullable primitive valuesIsPrimitive 不包括可为空的原始值
【发布时间】:2014-01-25 06:28:23
【问题描述】:

我想检查一个类型是否是原始类型并使用以下代码:

return type.IsValueType && type.IsPrimitive;

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

【问题讨论】:

  • 您需要识别可以为空的类型,然后深入研究它们以获取封闭的泛型类型:stackoverflow.com/questions/5644587/… Nullable<T> 不是原始的,它只是一个 struct 对其他 struct 的包装器具有额外编译器支持的类型。
  • 那个int?Nullable<int>的简写,所以不报原语是正确的。
  • Nullables 使用 Generic 类型,根据定义它不是原始类型。试试下面的建议:)
  • 你真正想要达到什么目的?我问是因为通常有比使用反射更好的方法。
  • @TimSchmelter 我正在做一个深度克隆并使用以下 (stackoverflow.com/a/11308879/2598770) 但我想对其进行一些修改并注意到 IsPrimitive 的检查不关心可空整数。

标签: c# types primitive


【解决方案1】:

首先您需要确定它是否为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
}

但需要注意的是,它可能是一个通用引用类型,实际上可能不满足您的需求的原语定义。同样,请记住,上述内容更简洁,但可能会返回误报。

【讨论】:

  • 可空类型的类型参数绝不是可空类型。
  • @EricLippert,所以不用担心递归吧?
  • 正确; Nullable&lt;T&gt; 在运行时的类型参数总是直接的值类型,没什么特别的。
【解决方案2】:

IsPrimitiveNullable&lt;int&gt;(也称为int?)上失败的原因是Nullable&lt;int&gt; 不是原语。它是泛型类Nullable&lt;T&gt; 的实例,类型参数为int

您可以通过验证来检查一个数字是否为可空原语

  • 它是一个泛型类型,
  • 它的泛型类型定义是Nullable&lt;&gt;,并且
  • 它的泛型参数类型IsPrimitive

【讨论】:

    【解决方案3】:

    来自 MSDN:

    基本类型有布尔、字节、SByte、Int16、UInt16、Int32、 UInt32、Int64、UInt64、IntPtr、UIntPtr、Char、Double 和 Single。

    所以基本上你应该期望Nullable&lt;Int32&gt; 不是是一个原始类型。

    您可以使用Nullable.GetUnderlyingTypeNullable&lt;Int32&gt; 中“提取”Int32

    【讨论】:

    • 感谢 Nullable.GetUnderlyingType,您不知道一种方法来检查自定义集合的 type.IsArray,如果是,则将其转换为数组?例如: CustomList : IList, IList, IEnumerable
    • @RandRandom:这是一个问答网站;如果这是您的问题,请将其作为问题发布,而不是作为评论。
    猜你喜欢
    • 2017-11-30
    • 1970-01-01
    • 2013-04-12
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 2017-05-22
    • 1970-01-01
    • 2023-01-27
    相关资源
    最近更新 更多