2012-05-17 230 views
2

我有一個保存搜索參數的類(SearchParameters),然後使用名爲Querybuilder的泛型類創建基於這些的查詢。這將返回結果並完美地完成所有工作。使用方法參數作爲泛型類型參數

結果顯示在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)?

回答

1
public void AddOrderByClause<D,E>(string field, E sourceDataType) 
{ 
    ..... 
} 
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); 
0

但我怎麼把它傳遞給AddOrderByClause()(通用參數d)?

好像你已經擁有的列數據類型,你搞清楚如何將它傳遞給泛型方法

下面是例子

首先修改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