6

同じタイプの IQueryable を返す IQueryable の拡張メソッドを作成しましたが、少しフィルターをかけただけです。それがそのようなものだとしましょう:

public static IEnumerable<T> Foo<T>(this IEnumerable<T> source, int? howmany = null)
{
    if (howmany.HasValue)
        return source.Take(howmany.Value);
    return source;
}

上記のメソッドを呼び出すのは簡単ですsomeLinqResult.Foo(2)

他のジェネリック クラスのインスタンスを返す他のメソッドが必要ですが、他の基本クラスが必要です(上記のソースとは異なりTます)。したがって、コードは次のとおりです。このメソッドは、指定された型 (IQueryable が持つ入力型以外!) のリストを返すはずですが、同じ長さ [実際の問題は NHibernate クエリ結果の変換に関するものですが、そうではありません。案件):

public static List<TTarget> Bar<TTarget,TSource>(this IEnumerable<TSource> source)
{
    return new List<TTarget>(source.Count());
}

strLinqResultがであることを考えると、IQueryable<string>これを と呼ぶ必要がありますstrLinqResult.Bar<int,string>();

ポイントは、すでに定義されているメソッドを呼び出しているため、最初の型は既にわかっているにもかかわらず、両方の型を渡す必要があるというIQuerableことです。

呼び出すだけで十分だったのでFoo(2)コンパイラ Foo<string>(2)は型を自動的に「渡す/推測」できると思いました。

では、なぜBar<int,string>();だけでなく、2 番目のメソッドを呼び出す必要があるのBar<int>()でしょうか。


実際のコード:

    public static ListResponse<TResponse> 
        BuildListResponse<T,TResponse>(this IQueryable<T> iq, ListRequest request)
        where TResponse: new()
    {
        var result = iq.ApplyListRequestParams(request).ToList().ConvertAll(x => x.TranslateTo<TResponse>());
        var tcount = iq.Count();
        return new ListResponse<TResponse> {
                Items =  result,
                _TotalCount = tcount,
                _PageNumber = request._PageNumber ?? 1,
            };
    }

ApplyListRequestParamsコード例の一種のメソッドです。オブジェクトFooで利用可能なページネーションと順序付けパラメータを適用するだけです。ListRequest

Itemsです。public List<T> Items_class ListResponse<T>

TranslateToServiceStack のメソッドです。

NHibernate (T はドメイン モデル) によって返された上記のメソッドIQueryable<T>は、要求パラメーター (順序付け、ページ付け) を受け取り、それらを適用してから、結果リストを からDomainModeltype の DTO オブジェクトに変換しますTResponse。次に、リストは一般的な応答クラスにラップされます (一般的なため、多くの DTO タイプで再利用可能です)。

4

1 に答える 1

3

私があなたの問題を正しく理解していれば、入力するパラメータをできるだけ少なくしようとしています。それは不可能です。自分ですべてを理解できるのは、すべてかゼロかです。

一部のみを指定することの問題は、型パラメーターが 1 つ少ない同様のメソッドを導入できるようになり、実装が壊れてしまうことです。

しかし、元の問題も共有できる可能性はありますか? コンパイラに別の方法でそれを理解させることができるでしょうか?

于 2013-06-16T20:02:42.057 に答える