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