2013-10-02 72 views
0

如何检查我接收的对象是否为方法结果不是ValueType而不是IEnumerable<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工作,但现在我想也排除字符串(这不被视为值类型),还等什么?

!(((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 ...

+2

你仅仅意味着'的getProperty( “Item”)。PropertyType.IsValueType'? –

+0

Type.IsValueType? –

+0

感谢您的回复!这是我所需要的。 – Teejay

回答

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) 

永远是假的,因为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); 
+0

哦,是的,对不起,在我写在这里的代码中,我忘记了'if(result is IEnumerable)'part :) – Teejay

+0

需要更多的工作 - IEnumerable。Item'被定义为'object'。如果你想知道它是否是'IEnumerable '而且'T'是一个值类型,你需要对泛型类型参数进行一些反射。 –

+0

不,“Item”只是返回枚举器的类型,刚试过。 – Teejay