0

既に戻り値の型を持つメソッドを拡張しようとしています。例えば:

IQueryable<int> GetCategoryIds()

したがって、これを次のように使用できます。

IQueryable<int> categories = GetCategoryIds();

そして、私は現在やっています:

IQueryable<int> categories = GetCategoryIds().Select(c => new Client() { ClientId == c.clientId });

Selectこれは機能しますが、そのステートメントを実行したくありません。a を除く拡張メソッドを使用したいので、拡張メソッドでtypeリフレクションを使用して型などを決定し、それに応じて結果を返すことができます。拡張メソッドは次のようになります。

public static IQueryable<T> LovelyExtension(this T objectType, int clientId)

次に、この拡張機能を次のように使用できます (うまくいけば):

IQueryable<int> categories = GetCategoryIds().LovelyExtension<int>(1);

これは可能ですか?GetCategoryIds試してみると、戻り値の型が拡張メソッドと同じではないため、エラーが発生しました。しかし、これはSelectステートメントで機能します。

4

3 に答える 3

2

に拡張機能を記述する必要はありませんType(あなたの例でもそれを行っていません)。に拡張子が必要ですIQueryable<T>。あなたはこのようにそれを行うことができます:

public static IQueryable<T> LovelyExtension<T>(this IQueryable<T> input, int clientId) {
    Type inputType = typeof(T);
    // Here you can use reflection if you need to: inputType corresponds to the type of T
    // Create an instance of IQueryable<T>, and return it to the caller.
}
于 2012-04-17T13:56:30.107 に答える
0

から署名を変更します。

public static IQueryable<T> LovelyExtension(this T objectType, int clientId) 

public static T LovelyExtension(this T objectType, int clientId) 

また

public static IQueryable<T> LovelyExtension(this IQuerable<T> objectType, int clientId) 

GetCategoryIds()はIQuerableを返します(これはLovelyExtensionのobjectTypeに渡すものであり、元の署名に基づく戻りタイプはIQuerableになります>これは明らかにあなたが求めているものとは一致しません。

于 2012-04-17T13:56:08.360 に答える
0

クライアントクラスでインターフェイスを宣言し、拡張メソッドに制約を追加する必要があると思います。この投稿のジェネリック拡張メソッドを見てください

于 2012-04-17T13:56:31.273 に答える