Udostępnij za pośrednictwem


Jak: Modyfikowanie wyrażenia drzew (C# i Visual Basic)

W tym temacie przedstawiono sposób zmodyfikować wyrażenie drzewa.Wyrażenia drzewa są niezmienne, co oznacza, że nie są bezpośrednio modyfikować.Aby zmienić wyrażenie drzewa, należy utworzyć kopię istniejącego drzewa wyrażenie i podczas tworzenia kopii, wprowadź wymagane zmiany.Można użyć ExpressionVisitor klasy do przechodzenia do istniejącego drzewa wyrażenie i skopiuj każdy węzeł, który ją odwiedzi.

[!UWAGA]

Można znaleźć kod źródłowy dla ExpressionVisitor klasy na witrynie CodePlex witryny sieci Web.

Aby zmodyfikować wyrażenie drzewa

  1. W Visual Studio, Utwórz nowy Console Application projektu.

  2. Dodaj AndAlsoModifier klasy do projektu.

    Ta klasa dziedziczy ExpressionVisitor klasy i jest wyspecjalizowane zmodyfikować wyrażeń, które reprezentują warunkowe AND operacji.Zmienia te operacje z warunkowego AND do warunkowego OR.W tym celu przesłonięcia klasy VisitBinary metodę typu podstawowego, ponieważ warunkowego AND wyrażeń są reprezentowane jako binarne wyrażenia.W VisitBinary metodę, jeżeli wyrażenie, które do niej przekazany reprezentują warunkowe AND konstrukcje kodu operacji, nowe wyrażenie warunkowe zawiera OR zamiast warunkowego operatora AND operatora.Jeśli wyrażenie, które jest przekazywane do VisitBinary nie reprezentują warunkowe AND operacji, metoda podporządkowuje się implementacji klasy podstawowej.Metody klasy bazowej węzłów konstrukcji, które są podobne do drzew wyrażenie, które są przekazywane w, ale węzły mają ich drzew sub zastąpione drzew wyrażenie, które są produkowane rekursywnie odwiedzający.

    Dodaj using dyrektywy (lub Imports instrukcję w języku Visual Basic) w pliku System.Linq.Expressions obszaru nazw.

    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
    
    public class AndAlsoModifier : ExpressionVisitor
    {
        public Expression Modify(Expression expression)
        {
            return Visit(expression);
        }
    
        protected override Expression VisitBinary(BinaryExpression b)
        {
            if (b.NodeType == ExpressionType.AndAlso)
            {
                Expression left = this.Visit(b.Left);
                Expression right = this.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);
            }
    
            return base.VisitBinary(b);
        }
    }
    
  3. Dodawanie kodu do Main metoda w pliku Plik Program.cs (Module1.vb w języku Visual Basic), aby utworzyć drzewo wyrażenie i przekazać je do metody, będzie go modyfikować.

    Poniższy kod tworzy zawiera warunkowe wyrażenie AND operacji.Następnie tworzy wystąpienie AndAlsoModifier klasy i przekazuje wyrażenia do Modify metoda tej klasy.Zarówno oryginał, jak i drzew zmodyfikowanych wyrażenia są wyprodukowania do pokazywania zmian.

    Dodaj using dyrektywy (lub Imports instrukcję w języku Visual Basic) w pliku System.Linq.Expressions obszaru nazw.

            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"))
    
    
                Expression<Func<string, bool>> expr = name => name.Length > 10 && name.StartsWith("G");
                Console.WriteLine(expr);
    
                AndAlsoModifier treeModifier = new AndAlsoModifier();
                Expression modifiedExpr = treeModifier.Modify((Expression) expr);
    
                Console.WriteLine(modifiedExpr);
    
                /*  This code produces the following output:
    
                    name => ((name.Length > 10) && name.StartsWith("G"))
                    name => ((name.Length > 10) || name.StartsWith("G"))
                */
    
    
  4. Skompilować i uruchomić aplikację.

Zobacz też

Zadania

Jak: wykonywanie wyrażenie drzew (C# i Visual Basic)

Koncepcje

Wyrażenie drzew (C# i Visual Basic)