Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym temacie przedstawiono sposób modyfikowania drzewa wyrażeń. Drzewa wyrażeń są niezmienne, co oznacza, że nie można ich modyfikować bezpośrednio. Aby zmienić drzewo wyrażeń, należy utworzyć kopię istniejącego drzewa wyrażeń i podczas tworzenia kopii wprowadzić wymagane zmiany. Możesz użyć ExpressionVisitor klasy, aby przejść przez istniejące drzewo wyrażeń i skopiować każdy węzeł, który odwiedza.
Aby zmodyfikować drzewo wyrażeń
Utwórz nowy projekt aplikacja konsolowa .
Dodaj instrukcję
Importsdo pliku dlaSystem.Linq.Expressionsprzestrzeni nazw.Dodaj klasę
AndAlsoModifierdo 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 ClassTa klasa dziedziczy klasę ExpressionVisitor i jest wyspecjalizowana do modyfikowania wyrażeń reprezentujących operacje warunkowe
AND. Zmienia te operacje z warunkowegoANDna warunkowyOR. W tym celu klasa zastępuje metodę VisitBinary typu podstawowego, ponieważ wyrażenia warunkoweANDsą reprezentowane jako wyrażenia binarne. W metodzieVisitBinary, jeśli wyrażenie przekazane do niego reprezentuje operację warunkowąAND, kod tworzy nowe wyrażenie, które zawiera operator warunkowyORzamiast operatora warunkowegoAND. Jeśli wyrażenie przekazane doVisitBinarynie reprezentuje operacji warunkowejAND, metoda odwołuje się do implementacji klasy bazowej. Metody klasy bazowej konstruują węzły, które przypominają przekazywane drzewa wyrażeń, ale węzły mają swoje poddrzewa zastąpione drzewami wyrażeń, które są rekursywnie tworzone przez odwiedzającego.Dodaj instrukcję
Importsdo pliku dlaSystem.Linq.Expressionsprzestrzeni nazw.Dodaj kod do
Mainmetody w pliku Module1.vb, aby utworzyć drzewo wyrażeń i przekazać go do metody, która ją zmodyfikuje.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"))Kod tworzy wyrażenie zawierające operację warunkową
AND. Następnie tworzy wystąpienieAndAlsoModifierklasy i przekazuje wyrażenie doModifymetody tej klasy. Zarówno oryginalne, jak i zmodyfikowane drzewa wyrażeń są zwracane w celu wyświetlenia zmiany.Skompiluj i uruchom aplikację.