В C #, почему деревья выражений и когда вам нужно их использовать? - PullRequest
4 голосов
/ 24 августа 2010

Когда мне нужны деревья выражений ?

И, пожалуйста, предоставьте нам образец реального мира, если имеется

Ответы [ 4 ]

8 голосов
/ 24 августа 2010

Например, чтобы реализовать безопасную для типов реализацию INotifyPropertyChanged вместо использования строк:

public class Sample : TypeSafeNotifyPropertyChanged
{
    private string _text;

    public string Text
    {
        get { return _text; }
        set
        {
            if (_text == value)
                return;

            _text = value;
            OnPropertyChanged(() => Text);
        }
    }
}

public class TypeSafeNotifyPropertyChanged : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged<T>(Expression<Func<T>> propertyExpression)
    {
        PropertyChangedHelper.RaisePropertyChanged(this, propertyExpression, PropertyChanged);
    }
}

public static class PropertyChangedHelper
{
    public static void RaisePropertyChanged<T>(object sender, Expression<Func<T>> propertyExpression, PropertyChangedEventHandler propertyChangedHandler)
    {
        if (propertyChangedHandler == null)
            return;

        if (propertyExpression.Body.NodeType != ExpressionType.MemberAccess)
            return;

        MemberExpression memberExpr = (MemberExpression)propertyExpression.Body;
        string propertyName = memberExpr.Member.Name;
        RaisePropertyChanged(sender, propertyName, propertyChangedHandler);
    }

    private static void RaisePropertyChanged(object sender, string property, PropertyChangedEventHandler propertyChangedHandler)
    {
        if (propertyChangedHandler != null)
            propertyChangedHandler(sender, new PropertyChangedEventArgs(property));
    }
}
7 голосов
/ 24 августа 2010

Вам нужно дерево выражений каждый раз, когда вы хотите сказать какой-то функции, что нужно сделать вместо того, чтобы фактически делать это .

Главный пример - LINQ-to-SQL. Вы передаете дерево выражений, чтобы оно могло преобразовать это дерево выражений в SQL. Он не выполняет выражение, он проверяет его и переводит в SQL.

5 голосов
/ 24 августа 2010

Дерево выражений - это описание некоторого исполнения - на самом деле это DOM.Когда вы выполняете дерево выражений, оно компилируется и после этого выполняется.Примером является LinqToSql.Когда вы создаете запрос для LinqToSql, вы делаете это на IQueryable.Результирующий запрос - это дерево выражений.Когда вы выполняете дерево, оно «компилируется» в SQL вместо .NET и выполняется в базе данных.

Edit: Здесь у вас есть еще один хороший пример выражения, использованногодля включения связанных сущностей в запрос EF.

1 голос
/ 24 августа 2010

Я недавно провел рефакторинг компаратора сложных объектов и использовал деревья выражений. Компаратор объектов был реализован с использованием отражения, и я изменил его, чтобы вместо этого построить дерево выражений с помощью отражения, а затем скомпилировать дерево выражений в делегат. Сборка и компиляция делегата сопряжены с небольшими затратами, но после его компиляции вызов почти в 100 раз быстрее, чем в отраженном решении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...