将类型化数组传递到泛型函数中
本文关键字:泛型 函数 类型化 数组 | 更新日期: 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);