Megosztás a következőn keresztül:


Útmutató: Kifejezésfák módosítása (Visual Basic)

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

  1. Hozzon létre egy új konzolalkalmazás-projektet .

  2. Adjon hozzá egy utasítást Imports a System.Linq.Expressions névtér fájljába.

  3. Adja hozzá az AndAlsoModifier osztá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 Class
    

    Ez az osztály örökli az ExpressionVisitor osztályt, és a feltételes AND műveleteket képviselő kifejezések módosítására specializálódott. Ezeket a műveleteket egy feltételes AND műveletről egy másik feltételes OR műveletre módosítja. Ehhez az osztály felülbírálja az VisitBinary alaptípus metódusát, mivel a feltételes AND kifejezések bináris kifejezésként jelennek meg. VisitBinary A metódusban, ha a neki átadott kifejezés feltételes AND műveletet jelöl, a kód egy új kifejezést hoz létre, amely a feltételes OR operátort tartalmazza a feltételes AND operátor helyett. Ha az átadott VisitBinary kifejezés nem jelent feltételes AND mű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.

  4. Adjon hozzá egy utasítást Imports a System.Linq.Expressions névtér fájljába.

  5. Adjon hozzá kódot a Main metó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 AND műveletet tartalmazó kifejezést. Ezután létrehozza az AndAlsoModifier osztály egy példányát, és átadja a kifejezést az Modify osztá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.

  6. Állítsa össze és futtassa az alkalmazást.

Lásd még