Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Det här avsnittet visar hur du ändrar ett uttrycksträd. Uttrycksträd är oföränderliga, vilket innebär att de inte kan ändras direkt. Om du vill ändra ett uttrycksträd måste du skapa en kopia av ett befintligt uttrycksträd och göra de nödvändiga ändringarna när du skapar kopian. Du kan använda ExpressionVisitor klassen för att korsa ett befintligt uttrycksträd och kopiera varje nod som den besöker.
Ändra ett uttrycksträd
Skapa ett nytt konsolprogramprojekt .
Lägg till en
Imports-instruktion i filen förSystem.Linq.Expressionsnamnområdet.Lägg till klassen i
AndAlsoModifierprojektet.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 ClassDen här klassen ärver ExpressionVisitor klassen och är specialiserad på att ändra uttryck som representerar villkorsstyrda
ANDåtgärder. De här åtgärderna ändras från en villkorligANDtill en villkorsstyrdOR. För att göra detta åsidosätter VisitBinary klassen metoden för bastypen, eftersom villkorsuttryckANDrepresenteras som binära uttryck.VisitBinaryOm uttrycket som skickas till metoden i metoden representerar en villkorsstyrdANDåtgärd konstruerar koden ett nytt uttryck som innehåller villkorsoperatornORi stället för den villkorsstyrdaANDoperatorn. Om uttrycket som skickas tillVisitBinaryinte representerar en villkorsstyrdANDåtgärd defersar metoden till basklassimplementeringen. Basklassmetoderna konstruerar noder som liknar de uttrycksträd som skickas in, men noderna får sina underträd ersatta med de uttrycksträd som genereras rekursivt av besökaren.Lägg till en
Imports-instruktion i filen förSystem.Linq.Expressionsnamnområdet.Lägg till
Mainkod i metoden i filen Module1.vb för att skapa ett uttrycksträd och skicka den till den metod som ska ändra den.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"))Koden skapar ett uttryck som innehåller en villkorsstyrd
ANDåtgärd. Sedan skapas en instans avAndAlsoModifierklassen och uttrycket skickas till metoden för denModifyhär klassen. Både det ursprungliga och det ändrade uttryckets träd matas ut för att visa ändringen.Kompilera och kör programmet.