2012-05-17 4 views
2

У меня есть класс (SearchParameters), который содержит параметры поиска, и затем создаю запрос linq на основе этих данных с помощью универсального класса 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 
Смежные вопросы