Деревья выражений являются хорошей функцией, но каковы ее практические применения? Они могут использоваться для своего рода генерации кода или метапрограммирования или некоторых такой?
Marc Gravell привык их для большого эффекта в MiscUtil для реализации универсальные операторы .
Как Jon отмечает, я использую их для обеспечения универсальные операторы с.NET 3.5. Я также использую их (снова в MiscUtil), чтобы предоставить быстрый доступ конструкторам не по умолчанию (Вы не можете использовать Delegate.CreateDelegate
с конструкторами, но Expression
хорошо работает).
Другое использование вручную созданных деревьев выражений:
, Но действительно, Выражение является очень универсальным способом записать любой динамический код. Намного более простой, чем Reflection.Emit
, и за мои деньги, более простые понять, чем CodeDOM. И в.NET 4.0, Вы имеете еще больше опций доступный. Я показываю основные принципы записи кода через Expression
на моем блоге .
Я использую их для создания динамических запросов, ли это быть для сортировки или фильтрации данных. Как пример:
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));
Реализация поставщиков LINQ главным образом сделана путем обработки деревьев выражений. Я также использую их для удаления литеральных строк из моего кода:
Можно использовать их для создания собственного linq поставщика для веб-сайта как Google или Flickr или Amazon, собственный сайт или другой поставщик данных.
Первоначально Jomo Fisher , Gustavo Guerra опубликовал исправленную версию статический строковый словарь .
, Где через Деревья выражений, динамическое выражение, которое обеспечивает действительно (чтение: смехотворно) Словарь.
реализация создает динамическое дерево решений, которые выбирают значение corrent согласно длине входной строки, затем первой буквой, тогда вторая буква и так далее.
Это в конечном счете работает намного быстрее, чем эквивалентный Словарь.