Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Ez a témakör bemutatja, hogyan módosíthatja a kifejezésfát. A kifejezésfák nem módosíthatók, ami azt jelenti, hogy közvetlenül nem módosíthatók. A kifejezésfa módosításához létre kell hoznia egy meglévő kifejezésfa másolatát, és a másolat létrehozásakor végezze el a szükséges módosításokat. Az ExpressionVisitor osztály használatával bejárhat egy meglévő kifejezésfát, és átmásolhatja a meglátogatott csomópontokat.
Kifejezésfa módosítása
Hozzon létre egy új konzolalkalmazás-projektet .
Adjon hozzá egy utasítást
ImportsaSystem.Linq.Expressionsnévtér fájljába.Adja hozzá az
AndAlsoModifierosztályt a projekthez.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 ClassEz az osztály örökli az ExpressionVisitor osztályt, és a feltételes
ANDműveleteket képviselő kifejezések módosítására specializálódott. Ezeket a műveleteket egy feltételesANDműveletről egy másik feltételesORműveletre módosítja. Ehhez az osztály felülbírálja az VisitBinary alaptípus metódusát, mivel a feltételesANDkifejezések bináris kifejezésként jelennek meg.VisitBinaryA metódusban, ha a neki átadott kifejezés feltételesANDműveletet jelöl, a kód egy új kifejezést hoz létre, amely a feltételesORoperátort tartalmazza a feltételesANDoperátor helyett. Ha az átadottVisitBinarykifejezés nem jelent feltételesANDműveletet, a metódus az alaposztály implementációjának ellenáll. Az alaposztály metódusai olyan csomópontokat hoznak létre, amelyek hasonlóak az átadott kifejezésfákhoz, de a csomópontok alárendelt fákkal helyettesítik a látogató által rekurzív módon előállított kifejezésfákat.Adjon hozzá egy utasítást
ImportsaSystem.Linq.Expressionsnévtér fájljába.Adjon hozzá kódot a
Mainmetódushoz a Module1.vb fájlban, hogy létrehozhasson egy kifejezésfát, és átadhassa azt a módosító metódusnak.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"))A kód létrehoz egy feltételes
ANDműveletet tartalmazó kifejezést. Ezután létrehozza azAndAlsoModifierosztály egy példányát, és átadja a kifejezést azModifyosztály metódusának. A rendszer az eredeti és a módosított kifejezésfákat is megjeleníti a módosítás megjelenítéséhez.Állítsa össze és futtassa az alkalmazást.