Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我如何判断我的泛型类型是否支持某个接口,并将其转换为函数的该接口?_C#_Generics_Collections_Interface - Fatal编程技术网

C# 我如何判断我的泛型类型是否支持某个接口,并将其转换为函数的该接口?

C# 我如何判断我的泛型类型是否支持某个接口,并将其转换为函数的该接口?,c#,generics,collections,interface,C#,Generics,Collections,Interface,我有一个方法如下所示: private IEnumerable<T> QueryCollection<T>() where T : BaseObj { IEnumerable<T> items = query<T>(); return items; } private IEnumerable<T> QueryCollection<T>() where T : BaseObj { IEnum

我有一个方法如下所示:

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

     if (typeOf(T).GetInterface(ITeamFilterable) != null)
     {
           items = FilterByTeams(items);
     }
     return items;
}
private IEnumerable QueryCollection(),其中T:BaseObj
{
IEnumerable items=query();
退货项目;
}
现在,如果“T”支持某个接口(可能不支持,因此我不能简单地将其添加为T的约束),我就想过滤这个items集合。所以我想要这样的东西:

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

     if (typeOf(T).GetInterface(ITeamFilterable) != null)
     {
           items = FilterByTeams(items);
     }
     return items;
}
private IEnumerable QueryCollection(),其中T:BaseObj
{
IEnumerable items=query();
if(typeOf(T).GetInterface(ITeamFilterable)!=null)
{
项目=过滤器字节(项目);
}
退货项目;
}
检查我的泛型类型是否支持某个接口**的建议方法是什么?如果是,则

  • 在方法中使用它来筛选集合
  • 但是仍然在总体方法中返回类型为“T”的集合
  • 注意:过滤器字节接受:

       IEnumerable<ITeamFilterable> 
    
    IEnumerable
    
    返回

       IEnumerable<ITeamFilterable>
    
    IEnumerable
    

    我是否需要将集合强制转换2次(一次转换为接口列表,然后再次转换回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;
    }
    

    强制转换将起作用,因为
    ITeamFilterable
    T
    IEnumerable
    是协变的,但您必须强制转换到
    对象
    ,以满足泛型约束。使用这些类型转换,无需复制项目。

    或者只需使用
    is
    /
    as
    +
    !=空
    。这不是重复的,因为链接的问题不处理协方差请参见我的问题的更新。您的答案不起作用,因为FilterByTeams不返回t的集合,而是返回ITeamFilterable的集合interface@leora答案更新了,这应该是你的答案,简言之,是的,你需要回溯,简言之,是的。但我的观点是,您不需要创建一个新的
    ITeamFilterable
    列表,仅仅为了拥有一个
    ITeamFilterable
    列表,强制转换就足够了,并且不会复制数据。我想我误解了你问题的这一方面。