你的问题是你的方法不是通用的,类是。请注意,在此之后没有<T>
方法名称,这意味着您必须传入一个 IQueryable,该 IQueryable 是您为该类的类型参数使用过的内容。
例如,如果对象是这样实例化的:
new BaseController<BaseObject>(..) //ignoring that BaseController is abstract
IQueryable<BaseObject>
在您希望传入IQueryable<Car>
控制器类型需要从中派生的情况下,您需要传递一个soBaseController<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()
}