在C#中,为什么表达树以及何时需要使用它们?

Hom*_*mam 4 c# lambda expression-trees c#-3.0

当我需要表达树

如果可以的话,请向我们提供真实世界的样本

Sco*_*rdo 8

例如,实现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));
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这是表达树派上用场的一个很好的例子,但我认为①它不是一个真正的例子,它只是方便; ②你发布的代码太多,解释太少.☺ (12认同)
  • 在示例`()=> Text`中,属性名称`Text`可能会被任何表达式错误地替换,并且它仍然可以正常编译.如果程序员没有提供成员的标识符,那么它在运行时无声地引发事件.那么这种"类型安全"在什么意义上呢? (2认同)

Tim*_*mwi 7

每次想要告诉某个函数需要做什么而不是实际执行它时,您需要一个表达式树.

最好的例子是LINQ-to-SQL.您传递表达式树,以便它可以将此表达式树转换为SQL.它不执行表达式,它检查它并将其转换为SQL.

  • 您的第一句话听起来更像是代表的描述而不是表达式树.它是否"需要完成"以及究竟是什么"完成"完全取决于表达的消费者. (2认同)

Lad*_*nka 5

表达式树是一些执行的描述 - 实际上它是DOM.执行表达式树时,它会被编译,然后执行.示例是LinqToSql.当您为LinqToSql构建查询时,您正在IQueryable上执行此操作.结果查询是表达式树.当您执行树时,它将"编译"为SQL而不是.NET并在数据库上执行.

编辑: 这里有另一个很好的Expression示例,用于在EF查询中包含相关实体.