Aracılığıyla paylaş


Nasıl yapılır: İfade Ağaçlarını Değiştirme (Visual Basic)

Bu konuda, bir ifade ağacının nasıl değiştirileceği gösterilmektedir. İfade ağaçları sabittir, yani doğrudan değiştirilemezler. İfade ağacını değiştirmek için var olan bir ifade ağacının kopyasını oluşturmanız ve kopyayı oluşturduğunuzda gerekli değişiklikleri yapmanız gerekir. Sınıfını ExpressionVisitor kullanarak var olan bir ifade ağacından geçiş yapabilir ve ziyaret ettiğiniz her düğümü kopyalayabilirsiniz.

İfade ağacını değiştirmek için

  1. Yeni bir Konsol Uygulaması projesi oluşturun.

  2. Dosyaya Imports ad alanı için bir System.Linq.Expressions ifade ekleyin.

  3. sınıfını AndAlsoModifier projenize ekleyin.

    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
    

    Bu sınıf ExpressionVisitor sınıfını devralır ve koşullu AND işlemleri temsil eden ifadeleri değiştirmek için özellikle tasarlanmıştır. Bu işlemleri bir koşullu AND işlemden başka bir koşullu OR işleme değiştirir. Bunu yapmak için, koşullu VisitBinary ifadeler ikili ifadeler AND olarak temsil edildiğinden, sınıf temel türün yöntemini geçersiz kılar. VisitBinary yönteminde, ona geçirilen ifade bir koşullu AND işlemi temsil ederse, kod, koşullu OR işleci yerine koşullu AND işleci içeren yeni bir ifade oluşturur. Geçirilen VisitBinary ifade bir koşullu AND işlemi temsil etmiyorsa, yöntem temel sınıfın uygulamasına başvurur. Temel sınıf yöntemleri, geçirilen ifade ağaçları gibi düğümler oluşturur, ancak düğümlerin alt ağaçlarının yerine ziyaretçi tarafından özyinelemeli olarak üretilen ifade ağaçları kullanılır.

  4. Dosyaya Imports ad alanı için bir System.Linq.Expressions ifade ekleyin.

  5. Module1.vb dosyasındaki Main yöntemine ifade ağacı oluşturmak ve onu değiştirecek yönteme geçirmek için kod ekleyin.

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

    Kod, koşullu AND işlem içeren bir ifade oluşturur. Ardından sınıfının bir örneğini AndAlsoModifier oluşturur ve ifadeyi bu sınıfın yöntemine Modify geçirir. Değişikliği göstermek için hem özgün hem de değiştirilmiş ifade ağaçları çıkarılır.

  6. Uygulamayı derleyin ve çalıştırın.

Ayrıca bakınız