2012-10-26 98 views
2

給定一個集合如何檢查對象的針對一個類型列表類型?

IEnumerable<Type> supportedTypes 

什麼檢查給定對象是否爲這些類型(或派生類型)的一個最好的方法是什麼?

我的第一反應是做這樣的事情:

// object target is a parameter passed to the method in which I'm doing this. 
if (supportedTypes.Count(supportedType => target is supportedType) > 0) 
{ 
    // Yay my object is of a supported type!!! 
} 

..但似乎並不奏效。我不能在這樣的lambda表達式中使用「is」關鍵字嗎?

回答

2

行,所以在打字的問題,並做更多的一些嘗試,以確保我不是問一些真正愚蠢的過程中,我意識到一個簡單的解決方案。張貼在這裏以防別人做某事同樣愚蠢。 ;-)

你不能用 「是」,在你的lambda表達式的關鍵字,但您可以使用:

supportedType => supportedType.IsInstanceOfType(target) 

產生:

if (supportedTypes.Count(supportedType => 
supportedType.IsInstanceOfType(target)) > 0) 

if (supportedTypes.Any(supportedType => 
           supportedType.IsInstanceOfType(target))) 
// object target is a parameter passed to the method in which I'm doing this. 
{ 
    // Yay my object is of a supported type!!! 
} 

帽尖鮑勃淡水河谷在低於該意見,我應該使用。任何(...),而不是被.Count中指出(...)> 0

+3

您應該使用的任何()而不是檢查計數 –

+0

作爲一個側面說明,我多麼希望自己精神上解析像'a.IsInstanceOf(B)'爲_「是B的實例? 「_ - 在這種情況下當然是倒退了。 –

+3

你確定'IsInstanceOf'是你想要的嗎? 'IsAssignableFrom'聽起來更像你想要的。 http://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx – asawyer

2

你爲什麼不使用Containstarget.GetType

bool ar isSupported = supportedTypes.Contains(target.GetType()); 

Any

bool isSupported = supportedTypes.Any(t => t == target.GetType()); 

(不使用Enumerable.Count,如果你只是想知道,如果一個序列包含匹配的元素,這是相當低效如果sequnce大或謂語是昂貴)

編輯:如果你想利用繼承的考慮,你可以使用Type.IsAssignableFrom

var isSupported = supportedTypes.Any(t => target.GetType().IsAssignableFrom(t)); 
  • is運算符用於檢查實例是否與給定類型兼容。
  • IsAssignableFrom方法用於檢查一個類型是否是與給定類型兼容。

確定是否當前的類型的實例可以從指定的類型的實例被分配 。

+0

.Contains或者顯式檢查與target.GetType()是否相等的問題是它不會處理繼承類型。 supportedTypes可能包含'Fruit',我需要測試才能成功獲得'Apple'或'Orange' –

+0

@RookieRick:編輯我的答案。 –