.net 如何识别类型是否为自定义结构?

.net 如何识别类型是否为自定义结构?,.net,reflection,struct,types,.net,Reflection,Struct,Types,对于类型,有一个属性IsClass,但是如何知道类型是一个结构 对不起,我必须补充一些信息 我用的是C# 虽然IsValueType是一个必要条件,但显然还不够。对于整数也是一种值类型。 如果它是值类型(例如,struct),请使用您可以使用IsValueType如果您谈论的是c#,您可以使用IsValueType属性。使用以下方法: x.GetType().IsValueType(); 从帮助: 类型::IsValueType属性 获取一个值,该值指示该类型是否为值类型。 值类型是表示为位

对于
类型
,有一个属性
IsClass
,但是如何知道
类型
是一个结构

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

  • 我用的是C#
  • 虽然
    IsValueType
    是一个必要条件,但显然还不够。对于整数也是一种值类型。

  • 如果它是值类型(例如,
    struct
    ),请使用

    您可以使用
    IsValueType
    如果您谈论的是c#,您可以使用
    IsValueType
    属性。

    使用以下方法:

     x.GetType().IsValueType();
    
    从帮助:

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

    那么,我想对于您的要求,这就很接近了:

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

    但是,例如,
    DateTime
    仍然不包括在内。可能您需要添加更多手动排除的类型。

    DateTime使用此代码给出正确的true结果。它不能正确处理枚举。我不明白
    的原因!t、 iPrimitive
    Boolean
    Byte
    Char
    Double
    (等等)不是结构体吗?有时在C中,我们这样计算它们,因为它们是值类型,但
    struct
    来自“结构化”,指的是结构体的复合性质(通常有多个字段,但允许0或1)关键字的起源可以追溯到C,尽管C#和C结构在几个方面有所不同。从这个问题中可以清楚地看出,OP的思维方式是后一种,而不是前一种。此视图不采用“一路向下”的透视图,而是将无法进一步分解的单元视为非结构。类型应用于存储位置时与应用于堆对象时具有不同的含义。在后台,每个值类型都有一个关联的堆类型。将值类型强制转换为
    对象
    或它实现的接口将创建一个新的堆对象,其字段从正在强制转换的值类型实例复制。对值类型调用
    GetType
    将首先将其强制转换为
    Object
    ,因为值类型没有
    GetType
    所需的类型析构函数字段。可能存在重复的
    t.IsValueType && !t.IsPrimitive && !t.IsEnum;