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
Yeni bir Konsol Uygulaması projesi oluşturun.
Ad alanı için
System.Linq.Expressions
dosyaya birImports
deyim ekleyin.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şulluyaAND
OR
değiştirir. Bunu yapmak için, koşulluAND
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şulluAND
işlemi temsil ederse, kod koşullu işleç yerineAND
koşulluOR
işleci içeren yeni bir ifade oluşturur. geçirilenVisitBinary
ifade bir koşulluAND
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.Ad alanı için
System.Linq.Expressions
dosyaya birImports
deyim ekleyin.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ğiniAndAlsoModifier
oluşturur ve ifadeyi bu sınıfın yöntemineModify
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.Uygulamayı derleyin ve çalıştırın.
Ayrıca bkz.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin