Вызов универсального метода с использованием лямбда-выражений (и типа, известного только во время выполнения)

Возможно, вы просто можете использовать javascript element.scrollTop вместе с JQuery addClass и removeClass. Я не пробовал это сам.

Вот ссылка переполнения для получения позиции полосы прокрутки: Как получить позицию полосы прокрутки с помощью Javascript?

14
задан SDReyes 17 May 2010 в 15:56
поделиться

2 ответа

static Expression<Func<IEnumerable<T>, T>> CreateLambda<T>()
{
    var source = Expression.Parameter(
        typeof(IEnumerable<T>), "source");

    var call = Expression.Call(
        typeof(Enumerable), "Last", new Type[] { typeof(T) }, source);

    return Expression.Lambda<Func<IEnumerable<T>, T>>(call, source)
}

или

static LambdaExpression CreateLambda(Type type)
{
    var source = Expression.Parameter(
        typeof(IEnumerable<>).MakeGenericType(type), "source");

    var call = Expression.Call(
        typeof(Enumerable), "Last", new Type[] { type }, source);

    return Expression.Lambda(call, source)
}
27
ответ дан 1 December 2019 в 02:19
поделиться

Я не совсем понимаю вопрос, но код, написанный 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 может быть намного сложнее, что было бы действительно сложно сделать, используя деревья выражений явно.

2
ответ дан 1 December 2019 в 02:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: