c# - 我如何判断我的泛型类型是否支持某个接口(interface)并为函数来回转换到该接口(interface)?

标签 c# generics collections interface

<分区>

我有一个看起来像这样的方法:

private IEnumerable<T> QueryCollection<T>() where T : BaseObj
{
      IEnumerable<T> items = query<T>();
      return items;
}

我现在有一种情况,如果“T”支持某个接口(interface)(它可能不支持,所以我不能简单地将它添加为 T 的约束),我想过滤这个项目集合。所以我想要这样的东西:

private IEnumerable<T> QueryCollection<T>() where T : BaseObj
{
     IEnumerable<T> items = query<T>();

     if (typeOf(T).GetInterface(ITeamFilterable) != null)
     {
           items = FilterByTeams(items);
     }
     return items;
}

检查我的通用类型是否支持某个接口(interface)的推荐方法是什么**然后如果是,则

  1. 在方法中使用它来过滤集合
  2. 但在整体方法中仍然返回类型为“T”的集合

注意:FilterByTeams 接受:

   IEnumerable<ITeamFilterable> 

并返回

   IEnumerable<ITeamFilterable>

我是否需要转换集合 2 次(一次转换为接口(interface)的 List,然后再次转换回 T 的列表?)

最佳答案

恐怕你不能使用is/as在这种情况下,除非您可以开始枚举查询。

你可以像这样使用反射:

private IEnumerable<T> QueryCollection<T>() where T : BaseObj
{
     IEnumerable<T> items = query<T>();

     if (typeof(ITeamFilterable).IsAssignableFrom(typeof(T)))
           items = (IEnumerable<T>)(object)FilterByTeams(items.Cast<ITeamFilterable>());

     return items;
}

但是如果您可以枚举查询,则可以这样做以避免反射(假设您没有 null 项):

private IEnumerable<T> QueryCollection<T>() where T : BaseObj
{
     IEnumerable<T> items = query<T>();
     ICollection<T> itemsCollection = items as ICollection<T> ?? items.ToList();

     if (itemsCollection.Count > 0)
     {
         var firstItem = itemsCollection.First();
         if (firstItem is ITeamFilterable)
             return (IEnumerable<T>)(object)FilterByTeams(itemsCollection.Cast<ITeamFilterable>());
     }

     return itemsCollection;
}

ITeamFilterable 起,类型转换将开始工作是 TIEnumerable<T>是协变的,但你必须转换为 object介于两者之间以满足泛型约束。使用这些转换,无需到处复制项目。

关于c# - 我如何判断我的泛型类型是否支持某个接口(interface)并为函数来回转换到该接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26084767/

相关文章:

java - 扩展泛型类时出现 ClassCastException

android - 在kotlin中findviewbuid作为T

Java:如何比较 List<String> 与 List<List<String>>?

collections - 加入的项目组上的 MSBuild 元数据

c# - 如何在asp上调用javascript函数和c#代码:button?

c# - 在异步方法内部调用时,方法是否必须是异步的?

java - 不存在类型变量 T 的实例,因此 List<T> 符合 Integer

collections - Java 8 Map合并VS计算,有本质区别吗?

c# - Jquery 发布到 ASP.NET API Controller

c# - LINQ to Entities 查询以展平结果并选择和分组所需信息