مشاركة عبر


كيفية القيام بما يلي: تعديل تعبير أشجار (C# و Visual Basic)

يوضح هذا الموضوع كيفية تعديل شجرة التعبيرات. تعتبر أشجار التعبير immutable ، مما يعني أن يقوموا ولا يمكن ‏‏تاريخ التعديلها مباشرةً. لتغيير شجرة تعبير ، يجب إنشاء نسخة شجرة التعبيرات موجودة ثم عندما تقوم بإنشاء النسخة, قم بإجراء التغييرات المطلوبة. يمكنك إستخدام فئة ExpressionVisitor باجتياز شجرة التعبيرات الموجودة ولنسخ كل العقد التي قامت بزيارتها.

ملاحظة

يمكنك العثور تشغيل التعليمات البرمجية المصدرية للفئة ExpressionVisitor على موقع CodePlex.

لتعديل شجرة التعبيرات

  1. في Visual Studio قم بإنشاء مشروع تطبيق وحدة تحكم جديد.

  2. أضف فئة AndAlsoModifier إلى مشروعك.

    ترث هذه الفئة فئة ExpressionVisitorو يتم التخصصية لتعديل التعبيرات التي تمثل العمليات الشرطية AND. تتغير هذه العمليات من الشرطي ANDإلى الشرطي OR. لفعل ذلك، الفئة تقوم الفئة بتجاوز الأسلوب VisitBinary من النوع الأساسي, لأن التعبيرات الشرطية AND يتم تمثيلها كتعبيرات ثنائية. في الأسلوب VisitBinary إذا كان التعبير التي يتم تمريره إليه يمثل العملية الشرطية AND،تقوم التعليمات برمجية بإنشاء تعبير جديد يحتوي على عامل التشغيل الشرطي ORبدلاً من عامل التشغيل الشرطي AND. إذا كان التعبير الذي تم تمريره إلى VisitBinaryلا يمثل عامل الشغيل الشرطي AND، ينتظر الأسلوب إلى تطبيق فئة أساسية. تقوم أساليب الفئة الأساسية ببناء عقد تشبه شجرات التعبير التي تم تمريرها في ولكن العقد تمتلك أشجاراً فرعية الخاصة بها استبدال الأشجار التعبير التي يتم إنتاجها بشكل متكرر بواسطة الزائر.

    إضافة التوجيهusing (أو عبارة Imports في Visual Basic) إلى الملف من أجل مساحة الاسم System.Linq.Expressions.

    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. إضافة تعليمات برمجية للأسلوب Main في ملف برنامج.cs (Module1.vb في Visual Basic) لإنشاء شجرة تعبير وتمريرها إلى الطريقة التي سيتم تعديلها.

    تعمل التعليمة البرمجية التالية على إنشاء تعبير يحتوي على أحد شرطي التشغيل AND. ثم تقوم بإنشاء مثيل لفئة AndAlsoModifier وتمرير التعبير إلى الأسلوب Modify من هذه الفئة. كلا أشجار التعبير الأصلية و المعدلة outputted لإظهار التغيير.

    إضافة التوجيهusing (أو عبارة Imports في Visual Basic) إلى الملف من أجل مساحة الاسم System.Linq.Expressions.

            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. قم بالترجمة ثم قم بتشغيل التطبيق الخاص بك.

راجع أيضًا:

المهام

كيفية القيام بما يلي: تنفيذ شجرة التعبيرات (C# و Visual Basic)

المبادئ

أشجار التعبير (C# و Visual Basic)