Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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 ExpressionVisitor můžete použít k procházení existujícího stromu výrazů a zkopírovat každý uzel, který procházíte.
Úprava stromu výrazů
Vytvořte nový projekt konzolové aplikace .
Přidejte příkaz
Importsdo souboru pro obor názvůSystem.Linq.Expressions.Přidejte třídu
AndAlsoModifierdo vašeho projektu.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 ClassTato třída dědí třídu ExpressionVisitor a je specializovaná na úpravu výrazů, které představují podmíněné operace
AND. Tyto operace se změní z podmíněnéhoANDna podmíněnýOR. K tomu třída přepíše VisitBinary metodu základního typu, protože podmíněnéANDvýrazy jsou reprezentovány jako binární výrazy.VisitBinaryPokud výraz předaný do této metody představuje podmíněnouANDoperaci, kód vytvoří nový výraz, který obsahuje podmíněnýORoperátor namísto podmíněnéhoANDoperátoru. Pokud výraz, který je předánVisitBinary, nepředstavuje podmíněnouANDoperaci, metoda deferuje na implementaci základní třídy. Metody základní třídy konstruují uzly, které se podobají předaným stromům výrazů, avšak uzly mají své dílčí stromy nahrazené stromy výrazů, které návštěvník vytváří rekurzivně.Přidejte příkaz
Importsdo souboru pro obor názvůSystem.Linq.Expressions.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
ANDoperaci. Pak vytvoří instanciAndAlsoModifiertřídy a předá výrazModifymetodě této třídy. Původní i upravené stromy výrazů se zobrazují, aby ukázaly změnu.Zkompilujte a spusťte aplikaci.