Я не до конца понимаю вопрос, но код, который написал dtb, может быть записан просто как:
class MyUtils {
public static Expression<Func<IEnumerable<T>, T>> CreateLambda<T>() {
return source => source.Last();
}
}
Код в образце от dtb - это почти то же самое, что и компилятор C #, автоматически генерируемый для вас из этого лямбда-выражения (скомпилированного как дерево выражений, потому что тип возвращаемого значения Expression
).
Если вы знаете тип во время выполнения, то вы можете использовать решение с помощью dtb или вызвать метод CreateLambda
(см. Выше), используя Reflection, который может быть медленнее, но позволяет писать код в лямбда-выражении. в натуральном C #:
var createMeth = typeof(MyUtils).GetMethod("CreateLambda");
LambdaExpression l = createMeth.MakeGenericMethod(yourType).Invoke();
Хорошая вещь в этом подходе состоит в том, что код в CreateLambda
может быть намного более сложным, что было бы очень трудно сделать с использованием деревьев выражений явно.