Практическое использование деревьев выражений

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

Ответ 1

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

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

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

Ответ 3

Я только что создал generic filter function с помощью ExpressionTree.. Я хочу share с вами, ребята...

Start

var allFiltered= Filter(AllCustomer, "Name", "Moumit");

public static List<T> Filter<T>(this List<T> Filterable, string PropertyName, object ParameterValue)
{
    ConstantExpression c = Expression.Constant(ParameterValue);
    ParameterExpression p = Expression.Parameter(typeof(T), "xx");
    MemberExpression m = Expression.PropertyOrField(p, PropertyName);
    var Lambda = Expression.Lambda<Func<T, Boolean>>(Expression.Equal(c, m), new[] { p });
    Func<T, Boolean> func = Lambda.Compile();
    return Filterable.Where(func).ToList();
}

One More

string singlePropertyName=GetPropertyName((Property.Customer p) => p.Name);

public static string GetPropertyName<T, U>(Expression<Func<T, U>> expression)
{
        MemberExpression body = expression.Body as MemberExpression;
        // if expression is not a member expression
        if (body == null)
        {
            UnaryExpression ubody = (UnaryExpression)expression.Body;
            body = ubody.Operand as MemberExpression;
        }
        return string.Join(".", body.ToString().Split('.').Skip(1));
}

Make it more expandable

string multiCommaSeparatedPropertyNames=GetMultiplePropertyName<Property.Customer>(c => c.CustomerId, c => c.AuthorizationStatus)

public static string GetMultiplePropertyName<T>(params Expression<Func<T, object>>[] expressions)
{
        string[] propertyNames = new string[expressions.Count()];
        for (int i = 0; i < propertyNames.Length; i++)
        {
            propertyNames[i] = GetPropertyName(expressions[i]);
        }

        return propertyNames.Join();
}

....... Я знаю, что это также можно сделать с помощью Reflection... но это очень быстро или я могу сказать, что это эквивалентно Lambda после первой компиляции... Самая первая итерация всего в среднем 10 миллисекунд медленнее... Итак, это волшебство Expression Tree. Простой и фантастический.... я думаю...!!!!!!!!

Ответ 4

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

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));

Ответ 5

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

Ответ 7

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

Ответ 8

Первоначально Jomo Fisher, Густаво Гуэрра опубликовала пересмотренную версию статический словарь строк.

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

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

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