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

时间:2013-10-02 14:33:27

标签: c# reflection value-type

如何检查我作为方法结果收到的对象是否不是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 ...

1 个答案:

答案 0 :(得分:3)

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