【问题标题】:How to check if T from IEnumerable<T> is IInterface?如何检查来自 IEnumerable<T> 的 T 是否为 IInterface?
【发布时间】:2014-03-07 02:14:43
【问题描述】:

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

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

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

【问题讨论】:

  • 这应该适用于 .Net 4。
  • @lee 太棒了:D

标签: c# generics types interface typechecking


【解决方案1】:

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

is 语句利用了泛型类型参数的协变,这是 C# 4 中添加的一项功能。在 C# 4 之前,该语句为 false。

【讨论】:

    【解决方案2】:

    之所以有效,是因为 IEnumerable&lt;T&gt; 实际上是 IEnumerable&lt;out T&gt;。如果没有 &lt;T&gt; 上的方差说明符,它将无法工作。

    所以,只要你的接口有正确的方差说明符,只要两边的'T'满足方差的类型,就可以了。

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

    【讨论】:

      【解决方案3】:
      x.GetGenericTypeDefinition() == typeof(IEnumerable<>) &&
      typeof(IInterface).IsAssignableFrom(x.GetType().GetGenericArguments()[0]);
      

      【讨论】:

      • 如果我给你一个 class MyList : List&lt;MyTypeWhichImplementsIInterface&gt;Dictionary&lt;TKey,TValue&gt; 的实例,这将无法正常工作
      • 你的意思是typeof(IInterface).IsAssignableFrom(...
      • @dcastro:你说得对,我总是得到低音。
      猜你喜欢
      • 2015-06-25
      • 2018-02-09
      • 2016-09-23
      • 1970-01-01
      • 2014-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多