在C#中,如何将类型化数组传递给泛型函数?

时间:2012-04-16 11:55:23

标签: c# generics collections

我有一个集合:

 IQueryable<Car>

我希望传入一个以参数形式接收的泛型函数:

 IQueryable<T>

类似的东西(位于基类中)

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

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

传递此信息的正确方法是什么?演员?,安全演员?

3 个答案:

答案 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);