我有一个集合:
IQueryable<Car>
我希望传入一个以参数形式接收的泛型函数:
IQueryable<T>
类似的东西(位于基类中)
public abstract class BaseController<T> : ControllerBase where T : BaseObj, new()
{
public IQueryable<T> FilterEntities(IQueryable<T> entities)
{
}
}
传递此信息的正确方法是什么?演员?,安全演员?
答案 0 :(得分:2)
public IQueryable<TQueryable> FilterEntities<TQueryable>(
IQueryable<TQueryable> entities)
{
}
您需要使方法成为通用方法(在函数名之后&lt; T&gt; ,然后才会告诉编译器方法是通用的。)
方法的类型参数TQueryable
与类类型不同。如果你不希望它对你的方法签名应该没问题。
答案 1 :(得分:2)
你的问题是你的方法不是通用的,类是。请注意,在方法名称之后没有<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()
}
答案 2 :(得分:0)
将FilterEntities定义如下
public IQueryable<T> FilterEntities<T>(IQueryable<T> entities)
{
}
现在你可以传递IQueryable,如下所示
IQueryable<Car> x = null; //Initialize it
FilterEntities<Car>(x);