如何检查来自IEnumerable <t>的T是否是IInterface?</t>

时间:2014-02-09 21:48:28

标签: c# generics types interface typechecking

基本上,这相当于什么,但100%保证可以工作?

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

从一些粗略的测试看起来似乎有效,但我不确定。

3 个答案:

答案 0 :(得分:6)

这适用于C#4,但不适用于以前的版本。

is语句利用了泛型类型参数的协方差,这是C#4中添加的一个特性。在C#4之前,该语句将为false。

答案 1 :(得分:3)

它有效,因为IEnumerable<T>实际上是IEnumerable<out T>。如果没有<T>上的方差说明符,它将无效。

所以,只要你的界面有正确的方差说明符,并且只要两边的'T'都满足方差的类型,那就没关系。

如果没有in/out说明符,则T必须完全匹配演员才能成功,并且CSJ提供的手动检查是唯一剩下的选项。

答案 2 :(得分:3)

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