如何确定类型是否为结构体?

10
给定一个具有Type属性的PropertyInfo实例,如何确定它是一个结构体?我发现有IsPrimitiveIsInterface等属性,但我不知道如何判断它是否是一个结构体? 编辑: 为了澄清问题。 假设我有一个方法:
public Boolean Check(PropertyInfo pi)
{
   return pi.Type.IsStruct;
}

我应该写什么代替 IsStruct

3个回答

12

Type.IsValueType 应该可以解决问题。

(摘自 这里)


1
谢谢。我想我还得检查一下!IsPrimitive,但那应该就可以了。 - Dejan Stanič
2
@Dejan:同时,基本类型(如布尔类型)也是结构体。 - Fredrik Mörk
你说得对,你需要!IsPrimitive。那么扩展方法呢? :D - OregonGhost
@Fredrik:谢谢,我知道 - 但我只需要检查“自定义”结构,所以最终我得到了这样的代码:return type.IsValueType && !type.IsPrimitive && type != typeof(Decimal); 这对于这个特定的需求是有效的。 - Dejan Stanič
1
为了解决像 typeof(Decimal) 这样的问题,我决定在一个项目中排除所有以 "System." 开头的类型 - 在我的项目中这是正确的做法。也许这对你有帮助。 - OregonGhost

2

结构体和枚举(IsEnum)属于值类型的超集合(IsValueType)。原始类型(IsPrimitive)是结构体的子集。这意味着所有原始类型都是结构体,但反之不成立;例如,int 既是原始类型也是结构体,但 decimal 只是一个结构体,不是原始类型。

所以你会发现唯一缺少的属性就是结构体了。很容易写一个:

public bool IsStruct(this Type type)
{
   return type.IsValueType && !type.IsEnum;
}

1
将Antony Koch的回答中的注释放入扩展方法中:
public static class ReflectionExtensions {
        public static bool IsCustomValueType(this Type type) {            
               return type.IsValueType && !type.IsPrimitive && type.Namespace != null && !type.Namespace.StartsWith("System.");
        }
    }

应该可以工作


考虑是否要包含或排除 IsEnum - 如果您只想查找自定义结构体。 - Nigel Touch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接