【问题标题】:How to identify if a Type is a custom struct?如何识别类型是否是自定义结构?
【发布时间】:2011-01-18 07:51:54
【问题描述】:

对于Type,有一个属性IsClass,但是怎么知道Type是一个结构体呢?

对不起,我必须补充一些信息。

  1. 我正在使用 C#。
  2. 虽然IsValueType是必要条件,但显然还不够。 Integer 也是一个值类型。

【问题讨论】:

标签: .net reflection struct types


【解决方案1】:
t.IsValueType && !t.IsPrimitive && !t.IsEnum;

【讨论】:

  • 我不明白!t.IsPrimitive 的原因。 BooleanByteCharDouble(等等...)不是结构吗?
  • 有时在 C# 中我们这样计算它们,因为它们是值类型,但 struct 来自“结构化”,指的是结构的复合性质(通常具有多个字段,尽管为 0或 1 是允许的)和 C 中关键字的起源,尽管 C# 和 C 结构在几个方面有所不同。从问题中可以清楚地看出,OP 正在考虑后一种方式而不是前者。这种观点没有采取“海龟一路向下”的观点,而是将无法进一步分解的单元视为结构。
【解决方案2】:

那么,我猜你的要求就差不多了:

bool isStruct = myType.IsValueType && !myType.IsPrimitive;

DateTime 仍然没有被包括在内。也许您必须手动添加要排除的其他类型。

【讨论】:

  • DateTime 使用此代码给出正确的结果 true。它是无法正确处理的枚举。
【解决方案3】:

使用这个:

 x.GetType().IsValueType();

来自帮助:

Type::IsValueType 属性 获取一个值,该值指示 Type 是否为值类型。 值类型是表示为位序列的类型;值类型不是类或接口。在某些编程语言中,值类型被称为“结构”。枚举是值类型的一种特殊情况。

【讨论】:

  • 类型在应用于存储位置时与应用于堆对象时具有不同的含义。在底层,每个值类型都有一个关联的堆类型。将值类型转换为Object 或它实现的接口将创建一个新的堆对象,其字段从被转换的值类型实例复制。对值类型调用 GetType 将首先将其转换为 Object,因为值类型没有 GetType 所需的类型限定符字段。
【解决方案4】:

如果你在谈论 c#,你可以使用IsValueType 属性。

【讨论】:

    【解决方案5】:

    您可以使用IsValueType

    【讨论】:

      【解决方案6】:

      如果是值类型(例如,struct),请使用 Type.IsValueType

      【讨论】:

        猜你喜欢
        • 2011-02-12
        • 2017-06-23
        • 1970-01-01
        • 1970-01-01
        • 2022-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多