كيفية القيام بما يلي: تعديل تعبير أشجار (C# و Visual Basic)
يوضح هذا الموضوع كيفية تعديل شجرة التعبيرات. تعتبر أشجار التعبير immutable ، مما يعني أن يقوموا ولا يمكن تاريخ التعديلها مباشرةً. لتغيير شجرة تعبير ، يجب إنشاء نسخة شجرة التعبيرات موجودة ثم عندما تقوم بإنشاء النسخة, قم بإجراء التغييرات المطلوبة. يمكنك إستخدام فئة ExpressionVisitor باجتياز شجرة التعبيرات الموجودة ولنسخ كل العقد التي قامت بزيارتها.
ملاحظة
يمكنك العثور تشغيل التعليمات البرمجية المصدرية للفئة ExpressionVisitor على موقع CodePlex.
لتعديل شجرة التعبيرات
في Visual Studio قم بإنشاء مشروع تطبيق وحدة تحكم جديد.
أضف فئة 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); } }
إضافة تعليمات برمجية للأسلوب 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")) */
قم بالترجمة ثم قم بتشغيل التطبيق الخاص بك.
راجع أيضًا:
المهام
كيفية القيام بما يلي: تنفيذ شجرة التعبيرات (C# و Visual Basic)