איך לפרק אקספרשן
-
בפוקנציה שהבאת יש ארגומנט אחד בשם predicate.
הוא מכילExpression<Func<MyClass, bool>>
שזה ביטוי מסוג פונקציה שמקבלת ארגומנט בודד של MyClass ומחזירה bool.
מה אתה יכול לעשות איתו? לקמפל אותו לפונקציה ולהפעיל אותה, למשל ככה:List<MyClass> listMyClass = new List<MyClass> { new MyClass { Name = "אני" }, new MyClass { Name = "אתה" }, new MyClass { Name = "והוא" } } public IEnumerable<MyClass> Find(Expression<Func<MyClass, bool>> predicate) { var methodToExecute = predicate.Compile(); foreach (var element in listMyClass) { if (methodToExecute(element)) Console.WriteLine("element true for condition"); else Console.WriteLine("element false for condition"); } return null; }
איך יוצרים
Expression<Func<MyClass, bool>>
? מציבים בו ביטוי למבדה מתאים, למשל:Find(x => x.Name.StartsWith("א")); Expression<Func<MyClass, bool>> pred = x => x.Name.Length > 2; Find(pred);
עם הExpression אפשר לבנות ביטויים מורכבים כמו עץ. לקבל למשל שתי ביטויים ולהפוך אותם לאחד של And וכו'.
-
כן. אפשר לקבל את זה כמחרוזת ע"י ToString וגם אפשר לפרק את זה לאובייקטים:
var exp = x => x.Name.Contains(""); Console.WriteLine(exp.ToString()); // x => (x.Name.Contains("")) var func = exp.Body; Console.WriteLine(func.ToString()); // ( x.Name.Contains("")) Console.WriteLine(func.Type == typeof(bool)); //true - returned type //body node type. true for x.Contains("xx"). //other: https://docs.microsoft.com/en-us/dotnet/api/system.linq.expressions.expressiontype?view=netcore-3.1 Console.WriteLine(func.NodeType == ExpressionType.Call); //check if the Node is a MethodCallExpression. if(func is MethodCallExpression funcAsMethod) Console.WriteLine( funcAsMethod.Method.Name); // Contains for x.Contains("y")