Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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
Buat proyek Aplikasi Konsol baru.
Tambahkan pernyataan
Importske file untuk namespaceSystem.Linq.Expressions.Tambahkan kelas
AndAlsoModifierke 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 ClassKelas ini mewarisi ExpressionVisitor kelas dan dikhususkan untuk memodifikasi ekspresi yang mewakili operasi kondisional
AND. Ini mengubah operasi ini dari kondisiANDmenjadi kondisiOR. Untuk melakukan ini, kelas mengambil alih VisitBinary metode jenis dasar, karena ekspresi bersyaratANDdirepresentasikan sebagai ekspresi biner. Dalam metodeVisitBinary, jika ekspresi yang diteruskan ke dalamnya mewakili operasi bersyaratAND, kode membuat ekspresi baru yang berisi operator kondisionalORalih-alih operator kondisionalAND. Jika ekspresi yang diteruskan keVisitBinarytidak mewakili operasi kondisionalAND, 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.Tambahkan pernyataan
Importske file untuk namespaceSystem.Linq.Expressions.Tambahkan kode ke
Mainmetode 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 kelasAndAlsoModifierdan ekspresinya diteruskan ke metodeModifydari kelas tersebut. Pohon ekspresi asli dan yang dimodifikasi dihasilkan untuk menampilkan perubahan.Kompilasi dan jalankan aplikasi.