Практическое применение деревьев выражений [закрывается]

Деревья выражений являются хорошей функцией, но каковы ее практические применения? Они могут использоваться для своего рода генерации кода или метапрограммирования или некоторых такой?

66
задан Dmitri Nesteruk 31 December 2008 в 14:36
поделиться

6 ответов

Marc Gravell привык их для большого эффекта в MiscUtil для реализации универсальные операторы .

21
ответ дан Jon Skeet 7 November 2019 в 11:13
поделиться

Как Jon отмечает, я использую их для обеспечения универсальные операторы с.NET 3.5. Я также использую их (снова в MiscUtil), чтобы предоставить быстрый доступ конструкторам не по умолчанию (Вы не можете использовать Delegate.CreateDelegate с конструкторами, но Expression хорошо работает).

Другое использование вручную созданных деревьев выражений:

, Но действительно, Выражение является очень универсальным способом записать любой динамический код. Намного более простой, чем Reflection.Emit, и за мои деньги, более простые понять, чем CodeDOM. И в.NET 4.0, Вы имеете еще больше опций доступный. Я показываю основные принципы записи кода через Expression на моем блоге .

43
ответ дан Marc Gravell 7 November 2019 в 11:13
поделиться

Я использую их для создания динамических запросов, ли это быть для сортировки или фильтрации данных. Как пример:

IQueryable<Data.Task> query = ctx.DataContext.Tasks;

if (criteria.ProjectId != Guid.Empty)
      query = query.Where(row => row.ProjectId == criteria.ProjectId);

if (criteria.Status != TaskStatus.NotSet)
      query = query.Where(row => row.Status == (int)criteria.Status);

if (criteria.DueDate.DateFrom != DateTime.MinValue)
      query = query.Where(row => row.DueDate >= criteria.DueDate.DateFrom);

if (criteria.DueDate.DateTo != DateTime.MaxValue)
     query = query.Where(row => row.DueDate <= criteria.DueDate.DateTo);

if (criteria.OpenDate.DateFrom != DateTime.MinValue)
     query = query.Where(row => row.OpenDate >= criteria.OpenDate.DateFrom);

var data = query.Select(row => TaskInfo.FetchTaskInfo(row));
12
ответ дан mattruma 7 November 2019 в 11:13
поделиться

Реализация поставщиков LINQ главным образом сделана путем обработки деревьев выражений. Я также использую их для удаления литеральных строк из моего кода:

8
ответ дан Mauricio Scheffer 7 November 2019 в 11:13
поделиться

Можно использовать их для создания собственного linq поставщика для веб-сайта как Google или Flickr или Amazon, собственный сайт или другой поставщик данных.

4
ответ дан tuinstoel 7 November 2019 в 11:13
поделиться

Первоначально Jomo Fisher , Gustavo Guerra опубликовал исправленную версию статический строковый словарь .

, Где через Деревья выражений, динамическое выражение, которое обеспечивает действительно (чтение: смехотворно) Словарь.

реализация создает динамическое дерево решений, которые выбирают значение corrent согласно длине входной строки, затем первой буквой, тогда вторая буква и так далее.

Это в конечном счете работает намного быстрее, чем эквивалентный Словарь.

2
ответ дан Community 7 November 2019 в 11:13
поделиться
Другие вопросы по тегам:

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