检查 IEnumerable 是否属于 ValueType(在运行时)

本文关键字:运行时 ValueType IEnumerable 是否 属于 检查 | 更新日期: 2023-09-27 18:33:33

如何检查我作为方法结果收到的对象是否ValueType和不IEnumerable<ValueType>

这是我写的:

MethodInfo selectedOverload = SelectOverload(selectedMethodOverloads);
object result = ExecuteAndShowResult(selectedOverload);
ExploreResult(result);
private static void ExploreResult(object result)
{
 if (result != null &&
     !(result is ValueType) &&
     !((IEnumerable)result).GetType().GetProperty("Item").PropertyType) is ValueType)
    )
    Console.WriteLine("explore");
}

不幸的是,PropertyType的类型是Type,它的内容是我需要检查的类型(例如 int),但我不知道该怎么做。

编辑:

好的,.IsValueType有效,但现在我还想排除字符串(不被识别为 ValueType),那又怎样?

!(((IEnumerable)result).GetType().GetProperty("Item").PropertyType is string)

不行!

编辑2:

刚刚回答自己:

!(((IEnumerable)result).GetType().GetProperty("Item").PropertyType == typeof(string))

关于如果我想检查基类的继承怎么办的问题仍然悬而未决

!(((IEnumerable)result).GetType().GetProperty("Item").PropertyType == typeof(BaseClass))

不起作用,因为 typeof 检查运行时类型,如果PropertyType == InheritedClassType它将返回 false...

检查 IEnumerable 是否属于 ValueType(在运行时)

使用 Type.IsValueType

private static void ExploreResult(object result)
{
 if (result != null &&
     !(result.GetType().IsValueType) &&
     !((IEnumerable)result).GetType().GetProperty("Item").PropertyType.IsValueType)
    )
    Console.WriteLine("explore");
}

虽然如果result不是值类型但不是IEnumerable,则会收到强制转换错误。 该检查需要一些工作。

对第二部分的回答

!((IEnumerable)result).GetType().GetProperty("Item").PropertyType is string)

始终为 false,因为PropertyType返回一个从来都不是字符串的Type。 我想你想要

!(result.GetType().GetProperty("Item").PropertyType == typeof(string))

请注意,我拿出了演员阵容来IEnumerable因为无论如何您都是通过反射寻找属性,因此演员阵容无关紧要。

第三次编辑的答案

我想检查基类的继承

为此,您需要type.IsAssignableFrom()

Type itemType = result.GetType().GetProperty("Item").PropertyType;
bool isInheritedFromBaseClass = 
    typeof(BaseClass).IsAssignableFrom(itemType);