Комментарии 10
Используйте habracut, очень прошу)
0
//Находим в классе Queryable метод с именем methodName. Магия поиска и создания шаблонного метода чуть ниже
var method = typeof(Queryable).GetGenericMethod(
methodName,
//Типы аргументов шаблона метода
new[] { typeof(T), expr.Type },
//Типы параметров метода
new[] { source.GetType(), lambda.GetType() }
);
//Выполняем метод, передавая ему неявный параметр this и лямбду.
//Т.е. выполняем source.OrderBy(x => x.property);
return (IOrderedQueryable<T>)method.Invoke(null, new object[] { source, lambda });
}
Кхм, а зачем? Можно же вызвать напрямую, информация о типа вся есть, у вас метод сам шаблонный.0
Это всё можно немного упростить:
public static class CustomQueryableExtensions {
public static IOrderedQueryable<TSource> OrderBy<TSource>(this IQueryable<TSource> source, string propName) {
var type = typeof (TSource);
var propertyType = type.GetProperty(propName).PropertyType;
var param = Expression.Parameter(type);
var keySelector = Expression.Lambda(Expression.PropertyOrField(param, propName), new[] {param});
return (IOrderedQueryable<TSource>) source.Provider.CreateQuery<TSource>(Expression.Call(
typeof (Queryable),
"OrderBy",
new[] {type, propertyType},
new[] {source.Expression, keySelector}));
}
}
+3
Можно не изобретать велосипед самому — Dynamic Linq.
+2
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Динамические Linq-запросы или приручаем деревья выражений