Postupy: Úprava stromů výrazů (Visual Basic)
V tomto tématu se dozvíte, jak upravit strom výrazů. Stromy výrazů jsou neměnné, což znamená, že je nelze přímo upravit. Pokud chcete změnit strom výrazů, musíte vytvořit kopii existujícího stromu výrazu a při vytváření kopie provést požadované změny. Třídu můžete použít ExpressionVisitor k procházení existujícího stromu výrazů a ke zkopírování každého uzlu, který navštíví.
Úprava stromu výrazů
Vytvořte nový projekt konzolové aplikace .
Přidejte do souboru pro
System.Linq.Expressions
obor názvů příkazImports
.Přidejte do
AndAlsoModifier
projektu třídu.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
Tato třída dědí třídu a je specializovaná na úpravu ExpressionVisitor výrazů, které představují podmíněné
AND
operace. Tyto operace se změní z podmíněnéhoAND
na podmíněnýOR
. K tomu třída přepíše VisitBinary metodu základního typu, protože podmíněnéAND
výrazy jsou reprezentovány jako binární výrazy.VisitBinary
Pokud výraz předaný do této metody představuje podmíněnouAND
operaci, kód vytvoří nový výraz, který obsahuje podmíněnýOR
operátor namísto podmíněnéhoAND
operátoru. Pokud výraz, který je předánVisitBinary
, nepředstavuje podmíněnouAND
operaci, metoda deferuje na implementaci základní třídy. Metody základní třídy vytvářejí uzly, které jsou podobné stromům výrazů, které jsou předány, ale uzly mají jejich dílčí stromy nahrazené stromy výrazů, které jsou vytvářeny rekurzivně návštěvníkem.Přidejte do souboru pro
System.Linq.Expressions
obor názvů příkazImports
.Do metody v souboru Module1.vb přidejte kód
Main
, který vytvoří strom výrazu a předá ho metodě, která ji upraví.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"))
Kód vytvoří výraz, který obsahuje podmíněnou
AND
operaci. Pak vytvoří instanciAndAlsoModifier
třídy a předá výrazModify
metodě této třídy. Původní i změněné stromy výrazů se zobrazí tak, aby se změna zobrazila.Zkompilujte a spusťte aplikaci.