C#中如何检查值是否为枚举数组类型?
如何检查对象是否为枚举数组类型
想判断某个对象的类型是不是枚举数组,别直接用obj.PropertyType == typeof(Enum[])——这玩意儿不管用,因为像SomeEnum[]这种具体枚举的数组,和Enum[]根本不是同一个类型,直接比类型只会匹配Enum[]本身,匹配不到具体枚举的数组。
正确的做法分两步:
- 先确认当前类型是数组(用
Type.IsArray) - 再拿数组的元素类型,检查它是不是枚举(用
ElementType.IsEnum)
对应的代码改成这样就行:
// obj = SomeEnum[20] else if (obj.PropertyType.IsArray && obj.PropertyType.GetElementType().IsEnum) { SetValue(parser, obj); }
如果还要兼容可空枚举数组(比如SomeEnum?[]),可以加个额外判断:
else if (obj.PropertyType.IsArray) { var elementType = obj.PropertyType.GetElementType(); // 同时处理普通枚举数组和可空枚举数组 if (elementType.IsEnum || (elementType.IsGenericType && elementType.GetGenericTypeDefinition() == typeof(Nullable<>) && elementType.GetGenericArguments()[0].IsEnum)) { SetValue(parser, obj); } }
为啥原代码不生效?
typeof(Enum[])指的是直接基于Enum的数组类型,但具体的枚举(比如SomeEnum)是Enum的子类,它们的数组类型SomeEnum[]和Enum[]在CLR里是完全不同的类型,所以用==对比肯定匹配不上。
内容的提问来源于stack exchange,提问作者user23924518
相关产品推荐
相关产品推荐

