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)
{
}

You need to make the method a generic method (the <T> after the function name before the parens tells the compiler the method is generic).

The type parameter TQueryable of the method differs from the class type. If you don't want it to your method signature should be fine.

于 2012-04-16T11:58:13.960 に答える
2

あなたの問題は、メソッドがジェネリックではなく、クラスがジェネリックであることです。メソッド名の後にはないことに注意<T>してください。これは、クラスの型引数に使用されたものの IQueryable を渡す必要があることを意味します。

たとえば、オブジェクトが次のようにインスタンス化された場合:

new BaseController<BaseObject>(..) //ignoring that BaseController is abstract

派生する必要があるコントローラーのタイプIQueryable<BaseObject>を渡したい場合は、 so を渡す必要があります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()
  }
于 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 に答える