2014-02-09 54 views
4

基本上,這將是相當於此,但是100%保證工作?如何檢查IEnumerable <T>是否是IInterface?

object x = new List<MyTypeWhichImplementsIInterface>(); 
bool shouldBeTrue = x is IEnumerable<IInterface>; 

從一些粗略的測試它似乎工作,但我不知道。

+0

這應該在使用.NET 4 – Lee

+0

@lee這真棒:d –

回答

6

這將在C#4中工作,但不適用於以前的版本。

is語句利用了泛型類型參數的協方差,這是C#4中添加的一項功能。在C#4之前,該語句是錯誤的。

3

它的工作原理是IEnumerable<T>實際上是IEnumerable<out T>。如果沒有<T>上的差異說明符,它將無法工作。

所以,只要你的接口有正確的方差說明符,並且只要雙方的'T'滿足方差的類型,就沒關係。

如果沒有in/out說明符,那麼T必須完全匹配才能使演員成功,並且只有CSJ提供的手動檢查纔是唯一的選項。

3
x.GetGenericTypeDefinition() == typeof(IEnumerable<>) && 
typeof(IInterface).IsAssignableFrom(x.GetType().GetGenericArguments()[0]); 
+2

如果我給你的'類MYLIST一個實例這將不正確的工作:名單'或'字典' –

+0

你的意思'typeof(IInterface).IsAssignableFrom(...' – dcastro

+0

@dcastro:你是對的,我總是得到那個低音讚賞。 – CSJ