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. Ad alanı için System.Linq.Expressions dosyaya bir Imports deyim 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 sınıfı devralır ExpressionVisitor ve koşullu AND işlemleri temsil eden ifadeleri değiştirmek için özelleşmiştir. Bu işlemleri koşulludan koşulluya ANDORdeğiştirir. Bunu yapmak için, koşullu AND ifadeler ikili ifadeler VisitBinary olarak temsil edildiğinden, sınıf temel türün yöntemini geçersiz kılar. yöntemindeVisitBinary, ona geçirilen ifade bir koşullu AND işlemi temsil ederse, kod koşullu işleç yerine AND koşullu OR 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 uygulamasına karşı gelir. 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. Ad alanı için System.Linq.Expressions dosyaya bir Imports deyim ekleyin.

  5. bir ifade ağacı oluşturmak ve bunu değiştirecek yönteme geçirmek için Module1.vb dosyasındaki yöntemine kod Main 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 bkz.