Aracılığıyla paylaş


Nasıl yapılır: deyim ağaçları (C# ve Visual Basic) değiştirme

Bu konuda bir ifade ağaç değiştirmek gösterilmiştir.İfade ağaçları Immutable, bunlar doğrudan değiştirilemez olduğunu anlamına gelir.Bir ifade ağaç değiştirmek için varolan bir ifadesi ağacında bir kopyasını oluşturun ve bir kopya oluşturduğunuzda, gerekli değişiklikleri yapın.Kullanabileceğiniz ExpressionVisitor sınıfı varolan bir ifadesi ağacında ilerlemelisiniz ve bunun gerçekleşmesi her düğüm kopyalamak için.

[!NOT]

Kaynak kodunu bulabilirsiniz ExpressionVisitor , sınıf CodePlex Web sitesi.

Bir ifade ağaç değiştirmek için

  1. De Visual Studio, yeni bir oluşturmak Console Application proje.

  2. Ekleme AndAlsoModifier sınıf projenize.

    Bu sınıf devralır ExpressionVisitor sınıf ve koşullu temsil eden ifadeler değiştirmek için özelleştirilmiş AND işlemleri.Koşullu bu işlemleri değiştirir AND bir koşul için OR.Bu sınıf geçersiz kılmaları yapmak için VisitBinary temel türü yöntemi çünkü koşullu AND ifadeler ikili ifadeler olarak temsil edilir.De VisitBinary yöntemi, kendisine geçirilen deyim koşullu gösteriyorsa AND işlemi, kod yapıları koşul içeren yeni bir ifade OR koşul yerine işleç AND işleci.Varsa geçirilir ifade VisitBinary koşullu göstermiyor AND işlemi, yöntemin temel sınıf uygulamasına defers.İçinde geçirilen ifade ağaçları benzediklerini yapýsý düğümler, ancak düğüm olan ifade ağaçları yerine kendi alt ağaçları olan taban sınıfın yöntemlerini yinelemeli olarak ziyaretçi tarafından üretilen.

    Ekleme bir using yönergesi (ya da Imports Visual Basic deyimi) dosyasına System.Linq.Expressions ad.

    Public Class AndAlsoModifier
        Inherits ExpressionVisitor
    
        Public Function Modify(ByVal expr As Expression) As Expression
            Return Visit(expr)
        End Function
    
        Protected Overrides Function VisitBinary(ByVal b As BinaryExpression) As Expression
            If b.NodeType = ExpressionType.AndAlso Then
                Dim left = Me.Visit(b.Left)
                Dim right = Me.Visit(b.Right)
    
                ' Make this binary expression an OrElse operation instead 
                ' of an AndAlso operation.
                Return Expression.MakeBinary(ExpressionType.OrElse, left, right, _
                                             b.IsLiftedToNull, b.Method)
            End If
    
            Return MyBase.VisitBinary(b)
        End Function
    End Class
    
    public class AndAlsoModifier : ExpressionVisitor
    {
        public Expression Modify(Expression expression)
        {
            return Visit(expression);
        }
    
        protected override Expression VisitBinary(BinaryExpression b)
        {
            if (b.NodeType == ExpressionType.AndAlso)
            {
                Expression left = this.Visit(b.Left);
                Expression right = this.Visit(b.Right);
    
                // Make this binary expression an OrElse operation instead of an AndAlso operation.
                return Expression.MakeBinary(ExpressionType.OrElse, left, right, b.IsLiftedToNull, b.Method);
            }
    
            return base.VisitBinary(b);
        }
    }
    
  3. Koda ekleyin Main yöntemi Program.cs (Module1.vb Visual Basic) dosyasında ifade ağacı oluşturmak ve bunu, yönteme onu değiştirmek.

    Aşağıdaki kodu içeren bir koşullu ifade oluşturur AND işlem.Sonra bir kopyasýný oluþturur AndAlsoModifier ifade geçirir ve sınıf Modify Bu sınıf yöntemi.Değişiklikleri göstermek için hem özgün hem de değiştirilmiş ifade ağaçları yüzdelik.

    Ekleme bir using yönergesi (ya da Imports Visual Basic deyimi) dosyasına System.Linq.Expressions ad.

            Dim expr As Expression(Of Func(Of String, Boolean)) = _
                Function(name) name.Length > 10 AndAlso name.StartsWith("G")
    
            Console.WriteLine(expr)
    
            Dim modifier As New AndAlsoModifier()
            Dim modifiedExpr = modifier.Modify(CType(expr, Expression))
    
            Console.WriteLine(modifiedExpr)
    
            ' This code produces the following output:
            ' name => ((name.Length > 10) && name.StartsWith("G"))
            ' name => ((name.Length > 10) || name.StartsWith("G"))
    
    
                Expression<Func<string, bool>> expr = name => name.Length > 10 && name.StartsWith("G");
                Console.WriteLine(expr);
    
                AndAlsoModifier treeModifier = new AndAlsoModifier();
                Expression modifiedExpr = treeModifier.Modify((Expression) expr);
    
                Console.WriteLine(modifiedExpr);
    
                /*  This code produces the following output:
    
                    name => ((name.Length > 10) && name.StartsWith("G"))
                    name => ((name.Length > 10) || name.StartsWith("G"))
                */
    
    
  4. Uygulamasını derlemek ve çalıştırmak.

Ayrıca bkz.

Görevler

Nasıl yapılır: yürütme ifade ağaçları (C# ve Visual Basic)

Kavramlar

İfade ağaçları (C# ve Visual Basic)