如何检查我作为方法结果收到的对象是否不是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
有效,但现在我还要排除字符串(不能识别为ValueTypes),那又怎么样?
!(((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 ...
答案 0 :(得分:3)
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);