簡體   English   中英

使用方法參數作為泛型類型參數

[英]Using method parameter as generic type argument

我有一個保存搜索參數的類(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)?

public void AddOrderByClause<D,E>(string field, E sourceDataType)
{
    .....
}

使用反射獲取方法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);

但是如何將其傳遞給AddOrderByClause()(通用參數D)?

似乎您已經具有列的數據類型,並且想出如何將其傳遞給Generic方法

以下是示例

首先修改AddOrderByClause以接受T(稍后在您的函數中使用)

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM