Здравствуйте, samius, Вы писали:
S>Здравствуйте, Serginio1, Вы писали:
S>>Здравствуйте, samius, Вы писали:
S>>>Тем, что оно не может принять два значения и сравнить их между собой, как это делают компараторы.
S>>Ок
S>>S>> Expression<Func<T,T,int>> func
S>>
S>Отлично, благодарю.
S>Но это еще не компаратор, это только его сигнатура. Осталось написать параметрически полиморфное тело компаратора и продемонстрировать как оно инлайнится.
То есть
System.Linq.Expressions.Expression<Func<int,int, int>> expr = (i,x) => i -x;
А как использовать деревья выражений я тебе уже кучу сслок давал.
На самом деле, что можно в рантайме, то можно и на этапе компиляции. Так или иначе компилятор строит AST дерево, и можно подставлять не адрес на функцию, а разворачитвать тело функции по адресу на этапе компиляции в CIL код.
public static IEnumerable<T> Compose<T, Y>(this IEnumerable<T> src, Expression<Func<T, Y>> propertyExpression, Expression<Func<Y, bool>> func)
{
return src.Where(Expression.Lambda<Func<T, bool>>(Expression.Invoke(func, propertyExpression.Body), propertyExpression.Parameters).Compile());
}