将类型化数组传递到泛型函数中

本文关键字:泛型 函数 类型化 数组 | 更新日期: 2023-09-27 18:31:11

我有一个集合IQueryable<Car>,我想将其传递给一个泛型函数,该函数将参数IQueryable<T>作为参数,类似于(位于基类中)。

public abstract class  BaseController<T> : ControllerBase  where T : BaseObj, new()
{
    public IQueryable<T> FilterEntities(IQueryable<T> entities)
    {
    }
}

传递它的正确方法是什么?投?安全演员?

将类型化数组传递到泛型函数中

你的问题是你的方法不是泛型的,类是泛型的。请注意,方法名称之后没有<T>,这意味着您必须传入用于类的类型参数的IQueryable。

例如,如果对象是这样实例化的:

new BaseController<BaseObject>(..) //ignoring that BaseController is abstract

您需要传递一个IQueryable<BaseObject>,因此在您希望传入IQueryable<Car>的情况下,控制器的类型需要从BaseController<Car>派生

另一方面,如果您希望该方法是通用的,请将该方法的签名更改为

public IQueryable<TElement> FilterEntities<TElement>
            (IQueryable<TElement> entities)

这不包括您在类的类型参数上拥有的 T 上的类型约束。如果应该对泛型方法强制实施此操作,则签名需要:

public IQueryable<TElement> FilterEntities<TElement>(IQueryable<TElement> entities) 
            where TElement : BaseObj, new()

编辑如果您希望有一个仅使用 T 作为类型参数的"默认"方法,则必须将其实现为非泛型方法,就像您在代码中一样,因此类将是:

  public abstract class  BaseController<T> : ControllerBase  
                where T : BaseObj, new()
  {
     public IQueryable<T> FilterEntities(IQueryable<T> entities)
     {
            return FilterEntities<T>(entities);
     }
     public IQueryable<TElement> FilterEntities<TElement>(IQueryable<TElement> entities) 
                where TElement : BaseObj, new()
  }
public IQueryable<TQueryable> FilterEntities<TQueryable>(
    IQueryable<TQueryable> entities)
{
}

您需要使该方法成为泛型方法(在括号告诉编译器该方法是泛型的函数名称之后的 )。

该方法的类型参数TQueryable与类类型不同。 如果你不希望它到你的方法签名应该没问题。

定义过滤器实体,如下所示

public IQueryable<T> FilterEntities<T>(IQueryable<T> entities)
{
}

现在你可以通过IQueryable,如下所示

    IQueryable<Car> x = null; //Initialize it
    FilterEntities<Car>(x);