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

В настоящее время Cypress cy.route может блокировать только сетевые запросы, использующие XHRs

Собственные элементы формы HTML не используют XMLHTTPRequest , поэтому вы не можете используйте cy.route, чтобы заглушить его.

Большинство людей не сталкиваются с этой проблемой, потому что использование нативных форм HTML не так распространено в наши дни

Редактировать:

Вы также waiting на маршрут, но на самом деле ничего не сделал в вашем тесте. Ваш тест должен выглядеть примерно так:

  cy.route('GET',
      '**/getIncentives*',
      {info: {}, results: {}}
  ).as('oppty');

  // cypress code that would cause a network request.

  cy.wait('@oppty');

Также убедитесь, что запрос имеет тип: XHR: enter image description here

14
задан Whisk 3 April 2009 в 17:14
поделиться

4 ответа

Библиотека Dynamic LINQ является прекрасным выбором, поскольку она генерирует выражения, которые можно скомпилировать для кодирования легким способом.

Пример, который Вы обеспечили на самом деле, производит булевскую переменную - таким образом, необходимо смочь попросить Func, и он мог бы уладить его.

Править: Это, конечно, неправильно, поскольку Выражения не имеют присвоения в них вообще.

Так, другой потенциальный путь состоит в том, чтобы взять две лямбды. Один для нахождения свойства Вы хотите, один для обеспечения значения:

(=> a. AccountId), (=> верный)

Затем используйте отражение для установки свойства, на которое ссылаются в первой лямбде с результатом второго. Hackish, но это все еще, вероятно, легко по сравнению с вызовом компилятора C#.

Таким образом, Вы не должны делать большого количества codegen сами - выражения, которые Вы получаете, будет содержать больше всего все, в чем Вы нуждаетесь.

4
ответ дан 1 December 2019 в 16:15
поделиться

Нет никакого общего способа проанализировать строку в лямбда-выражение без полной компиляции, потому что лямбда-выражения могут сослаться на вещи, которые определяются вне лямбда-выражения. Я не знаю ни о какой библиотеке, которая обрабатывает конкретный случай, который Вы хотите. Существует долгое обсуждение этого на потоке на дискуссионной группе C#.

Самый легкий способ добраться, что Вы хотите, состоит в том, чтобы скомпилировать метод во времени выполнения. Можно записать функцию, которая берет в строке "a. Включенный = верный; возвратите a"; и палки, что посреди функции, которая уделяет Внимание в качестве параметра. Я пользовался бы этой библиотекой как начальной точкой, но можно также использовать функцию, упомянутую на другом потоке.

1
ответ дан 1 December 2019 в 16:15
поделиться

Это просто:

  • Используйте CodeDom , чтобы сгенерировать модуль, содержащий «окружающий класс», который вы будете использовать для построения выражения; этот класс должен реализовывать интерфейс, известный вашему приложению.
  • Используйте CodeSnippedExpression , чтобы вставить выражение в его член.
  • Используйте тип Activator , чтобы создать экземпляр этого класса во время выполнения .

По сути, вам нужно создать следующий класс с помощью CodeDom:

using System;
using MyNamespace1;
using ...
using MyNamespace[N];

namespace MyNamespace.GeneratedTypes 
{
  public class ExpressionContainer[M] : IHasAccountAction
  {
    public Action<Account> AccountAction { 
      get {
        return [CodeSnippedExpression must be used here];
      }
    } 
  }
}

Предполагая, что IHasAccountAction равно:

public IHasAccountAction {
  public Action<Account> AccountAction { get; }
}

Если это сделано, вы можете легко скомпилировать выражение из строки. Если вам нужно его представление в виде дерева выражений, используйте Expression > вместо Action в сгенерированном типе.

0
ответ дан 1 December 2019 в 16:15
поделиться

Вы можете попробовать следующее: Динамические лямбда-выражения с использованием изолированного домена приложения

Он компилирует лямбда-выражение с помощью компилятора CodeDOM. Чтобы избавиться от созданной сборки в памяти, компилятор запускается в изолированном AppDomain . Для передачи выражения через границу домена его необходимо сериализовать. Увы, Expression <> не Serializable . Итак, нужно использовать хитрость. Все подробности описаны в сообщении.

Кстати, я автор этого компонента. Я очень хотел бы услышать ваши отзывы об этом.

3
ответ дан 1 December 2019 в 16:15
поделиться
Другие вопросы по тегам:

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