Pull to refresh

Comments 10

//Находим в классе 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 });
}

Кхм, а зачем? Можно же вызвать напрямую, информация о типа вся есть, у вас метод сам шаблонный.
Не получится, так как неизвестен тип поля, к которому обращаемся в лямбде.
Это всё можно немного упростить:

    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}));
        }
    }
Да, ток увидел первые примеры сразу подумал о этой библиотеке.
Вот ведь! все уже придумано до нас :-)
Sign up to leave a comment.

Articles

Change theme settings