Bagikan melalui


Cara: Memodifikasi Pohon Ekspresi (Visual Basic)

Topik ini memperlihatkan kepada Anda cara mengubah pohon ekspresi. Pohon ekspresi tidak dapat diubah, yang berarti tidak dapat dimodifikasi secara langsung. Untuk mengubah pohon ekspresi, Anda harus membuat salinan pohon ekspresi yang sudah ada dan saat membuat salinan, buat perubahan yang diperlukan. Anda dapat menggunakan ExpressionVisitor kelas untuk melintasi pohon ekspresi yang ada dan menyalin setiap simpul yang dikunjunginya.

Untuk mengubah pohon ekspresi

  1. Buat proyek Aplikasi Konsol baru.

  2. Tambahkan pernyataan Imports ke file untuk namespace System.Linq.Expressions.

  3. Tambahkan kelas AndAlsoModifier ke proyek Anda.

    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
    

    Kelas ini mewarisi ExpressionVisitor kelas dan dikhususkan untuk memodifikasi ekspresi yang mewakili operasi kondisional AND . Ini mengubah operasi ini dari kondisi AND menjadi kondisi OR. Untuk melakukan ini, kelas mengambil alih VisitBinary metode jenis dasar, karena ekspresi bersyarat AND direpresentasikan sebagai ekspresi biner. Dalam metode VisitBinary, jika ekspresi yang diteruskan ke dalamnya mewakili operasi bersyarat AND, kode membuat ekspresi baru yang berisi operator kondisional OR alih-alih operator kondisional AND. Jika ekspresi yang diteruskan ke VisitBinary tidak mewakili operasi kondisional AND, metode akan menggunakan implementasi dari kelas dasar. Metode kelas dasar membangun simpul yang mirip dengan pohon ekspresi yang diteruskan, tetapi simpul ini memiliki sub pohon yang diganti dengan pohon ekspresi yang dihasilkan secara rekursif oleh pengunjung.

  4. Tambahkan pernyataan Imports ke file untuk namespace System.Linq.Expressions.

  5. Tambahkan kode ke Main metode dalam file Module1.vb untuk membuat pohon ekspresi dan meneruskannya ke metode yang akan memodifikasinya.

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

    Kode membuat ekspresi yang berisi operasi bersyarah AND . Kemudian, dibuat sebuah instans dari kelas AndAlsoModifier dan ekspresinya diteruskan ke metode Modify dari kelas tersebut. Pohon ekspresi asli dan yang dimodifikasi dihasilkan untuk menampilkan perubahan.

  6. Kompilasi dan jalankan aplikasi.

Lihat juga