2

検索パラメーターを保持するクラス (SearchParameters) があり、Querybuilder という汎用クラスを使用して、これらに基づいて linq クエリを作成します。これにより結果が返され、すべてが完全に機能します。

結果は GridView に表示されます。現在、gridivew のカスタム並べ替えを実装しています。検索対象のフィールドを SearchParameters オブジェクトに追加します (流暢なインターフェイスを使用)。

SearchParameters=SearchParameters.SortResultsBy(e.SortExpression,e.NewSortOrder.ToString());

AddOrderByClause() メソッドの汎用パラメーターとして使用する列のデータ型が必要です。

    public void AddOrderByClause<D>(string field, Type sourceDateType)
    {
        var orderExpression = Expression.Lambda<Func<T, D>>(Expression.Property(resultExpression, field), resultExpression);

        rootExpression = Expression.Call(
              typeof(Queryable),
              "OrderBy",
              new Type[] { typeof(T), typeof(D) },
       rootExpression,
       orderExpression);

    }

AddOrderByClause()列のデータ型を簡単に見つけることができますが、それを(ジェネリック パラメータ D)に渡すにはどうすればよいですか?

4

3 に答える 3

1
public void AddOrderByClause<D,E>(string field, E sourceDataType)
{
    .....
}
于 2012-05-17T11:03:05.750 に答える
0

しかし、どうすれば AddOrderByClause() (ジェネリック パラメータ D) に渡すことができますか?

あなたはすでに列のデータ型を持っているようで、それをジェネリックメソッドに渡す方法を考え出しています

以下は例です

最初に T を受け入れるように AddOrderByClause を変更します (後で関数で使用します)。

public void AddOrderByClause<D,T>(String field)
{
....
}

次に、 AddOrderByClause を次のように呼び出します

 var data = SearchParameter;// Use actual data if SearchParameter is not correct
 AddOrderByClause<D,date.GetType()>(fieldData);// assuming fieldData is something different 
 var data = SearchParameter;// Use actual data if SearchParameter is not currect
于 2012-05-17T11:17:16.800 に答える
0

リフレクションを使用してメソッドAddOrderByClauseを取得し、次にMakeGenericMethodを使用してジェネリックを取得します。これは一般的な考え方です (すべての型の名前がわからないため、少しあいまいです)。

Type MyTypeParameter;    // TODO set this to type parameter D
Type type;               // TODO set this to the type that contains the method "AddOrderByClause"
MethodInfo method = type.GetMethod("AddOrderByClause");
MethodInfo genericMethod = method.MakeGenericMethod(typeof(MyTypeParameter));
genericMethod.Invoke(MyClassInstance, FieldParam, SourceDataParam);
于 2012-05-17T11:03:25.810 に答える