0

我有一个集合IQueryable<Car>,我想将它传递给一个作为参数接收的通用函数,IQueryable<T>比如(它位于基类中)。

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

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

4

3 回答 3

2
public IQueryable<TQueryable> FilterEntities<TQueryable>(
    IQueryable<TQueryable> entities)
{
}

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

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

于 2012-04-16T11:58:13.960 回答
2

你的问题是你的方法不是通用的,类是。请注意,在此之后没有<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()
  }
于 2012-04-16T12:04:19.767 回答
0

定义 FilterEntities 如下

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

现在你可以通过 IQueryable 如下

    IQueryable<Car> x = null; //Initialize it
    FilterEntities<Car>(x);
于 2012-04-16T12:02:35.417 回答