C# 将类型化数组传递到泛型函数?

C# 将类型化数组传递到泛型函数?,c#,generics,collections,C#,Generics,Collections,我有一个集合IQueryable,我想把它传递到一个通用函数中,该函数作为参数IQueryable,类似于(位于基类中) public抽象类BaseController:ControllerBase其中T:BaseObj,new() { 公共IQueryable筛选器实体(IQueryable实体) { } } 什么是传递信息的正确方式?铸造安全铸造?公共液体过滤器( public IQueryable<TQueryable> FilterEntities<TQueryabl

我有一个集合
IQueryable
,我想把它传递到一个通用函数中,该函数作为参数
IQueryable
,类似于(位于基类中)

public抽象类BaseController:ControllerBase其中T:BaseObj,new()
{
公共IQueryable筛选器实体(IQueryable实体)
{
}
}
什么是传递信息的正确方式?铸造安全铸造?

公共液体过滤器(
public IQueryable<TQueryable> FilterEntities<TQueryable>(
    IQueryable<TQueryable> entities)
{
}
可查询实体) { }
您需要使该方法成为泛型方法(在parens告诉编译器该方法是泛型方法之前,函数名后面的

方法的类型参数
TQueryable
与类类型不同。如果您不想将其添加到方法签名中,则可以使用。

公共IQueryable筛选器属性(
可查询实体)
{
}
您需要使该方法成为泛型方法(在parens告诉编译器该方法是泛型方法之前,函数名后面的


方法的类型参数
TQueryable
与类类型不同。如果您不想将其添加到方法签名中,则可以使用它。

如下定义筛选器属性

public IQueryable<T> FilterEntities<T>(IQueryable<T> entities)
{
}
公共IQueryable筛选器属性(IQueryable实体)
{
}
现在您可以通过如下所示的IQueryable

    IQueryable<Car> x = null; //Initialize it
    FilterEntities<Car>(x);
IQueryable x=null//初始化它
过滤性(x);

如下定义过滤器属性

public IQueryable<T> FilterEntities<T>(IQueryable<T> entities)
{
}
公共IQueryable筛选器属性(IQueryable实体)
{
}
现在您可以通过如下所示的IQueryable

    IQueryable<Car> x = null; //Initialize it
    FilterEntities<Car>(x);
IQueryable x=null//初始化它
过滤性(x);

您的问题是您的方法不是泛型的,而类是泛型的。注意,在方法名之后没有
,这意味着您必须传入一个IQueryable,其中包含您曾经为类的类型参数使用过的内容

例如,如果对象是这样实例化的:

new BaseController<BaseObject>(..) //ignoring that BaseController is abstract
new BaseController(..)//忽略BaseController是抽象的
您需要传递一个
IQueryable
,因此在您希望传递
IQueryable
的情况下,控制器的类型需要从
BaseController

另一方面,如果您希望该方法是泛型的,请将该方法的签名更改为

public IQueryable<TElement> FilterEntities<TElement>
            (IQueryable<TElement> entities)
public IQueryable过滤器属性
(可查询实体)
它不包括类的类型参数上的类型约束。如果应该对泛型方法强制执行此操作,则签名需要:

public IQueryable<TElement> FilterEntities<TElement>(IQueryable<TElement> entities) 
            where TElement : BaseObj, new()
公共IQueryable筛选器属性(IQueryable实体)
其中TElement:BaseObj,new()
编辑 如果您希望有一个“default”方法,该方法仅使用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()
  }
公共抽象类BaseController:ControllerBase
其中T:BaseObj,new()
{
公共IQueryable筛选器实体(IQueryable实体)
{
返回过滤实体(实体);
}
公共IQueryable筛选器实体(IQueryable实体)
其中TElement:BaseObj,new()
}

您的问题是您的方法不是泛型的,而类是泛型的。注意,在方法名之后没有
,这意味着您必须传入一个IQueryable,其中包含您曾经为类的类型参数使用过的内容

例如,如果对象是这样实例化的:

new BaseController<BaseObject>(..) //ignoring that BaseController is abstract
new BaseController(..)//忽略BaseController是抽象的
您需要传递一个
IQueryable
,因此在您希望传递
IQueryable
的情况下,控制器的类型需要从
BaseController

另一方面,如果您希望该方法是泛型的,请将该方法的签名更改为

public IQueryable<TElement> FilterEntities<TElement>
            (IQueryable<TElement> entities)
public IQueryable过滤器属性
(可查询实体)
它不包括类的类型参数上的类型约束。如果应该对泛型方法强制执行此操作,则签名需要:

public IQueryable<TElement> FilterEntities<TElement>(IQueryable<TElement> entities) 
            where TElement : BaseObj, new()
公共IQueryable筛选器属性(IQueryable实体)
其中TElement:BaseObj,new()
编辑 如果您希望有一个“default”方法,该方法仅使用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()
  }
公共抽象类BaseController:ControllerBase
其中T:BaseObj,new()
{
公共IQueryable筛选器实体(IQueryable实体)
{
返回过滤实体(实体);
}
公共IQueryable筛选器实体(IQueryable实体)
其中TElement:BaseObj,new()
}

此方法是否在泛型类中定义?因为您的方法不是泛型的,所以它不定义任何类型参数。这取决于您希望在…之后对它执行什么操作…如果您只想在
IQueryable
的实例中传递,为什么要将此方法设置为通用方法?不确定您希望如何处理
BaseController
,但如果可能,我会尽量避免使用它们。例如,如果希望在项目中使用普通控制器、web api控制器和异步控制器,则需要创建三个基本控制器并复制一些代码。相反,您应该查看全局或控制器级筛选器。此方法是在泛型类中定义的吗?因为您的方法不是泛型的,所以它不定义任何类型参数。这取决于您希望在…之后对它执行什么操作…如果您只想在
IQueryable
的实例中传递,为什么要将此方法设置为通用方法?不确定您希望如何处理
BaseController
,但如果可能,我会尽量避免使用它们。例如,如果要使用普通控制器,