Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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.
Dosyaya
Importsad alanı için birSystem.Linq.Expressionsifade ekleyin.sınıfını
AndAlsoModifierprojenize 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 ClassBu sınıf ExpressionVisitor sınıfını devralır ve koşullu
ANDişlemleri temsil eden ifadeleri değiştirmek için özellikle tasarlanmıştır. Bu işlemleri bir koşulluANDişlemden başka bir koşulluORişleme değiştirir. Bunu yapmak için, koşullu VisitBinary ifadeler ikili ifadelerANDolarak temsil edildiğinden, sınıf temel türün yöntemini geçersiz kılar.VisitBinaryyönteminde, ona geçirilen ifade bir koşulluANDişlemi temsil ederse, kod, koşulluORişleci yerine koşulluANDişleci içeren yeni bir ifade oluşturur. GeçirilenVisitBinaryifade bir koşulluANDiş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.Dosyaya
Importsad alanı için birSystem.Linq.Expressionsifade ekleyin.Module1.vb dosyasındaki
Mainyö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
ANDişlem içeren bir ifade oluşturur. Ardından sınıfının bir örneğiniAndAlsoModifieroluşturur ve ifadeyi bu sınıfın yöntemineModifygeç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.