2013-10-02 113 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