检查 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...
使用 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);