איך לפרק אקספרשן
-
יש לצורך העניין פונקציה כזאת:
public IEnumerable<MyClass> Find(Expression<Func<MyClass, bool>> predicate ) { // מה שלחו לי כאן? איזה פרופרטיז? אילו אופרטורים?? }תודה.
בפוקנציה שהבאת יש ארגומנט אחד בשם 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")
שלום! נראה שהשיחה הזו מעניינת אותך, אבל עדיין אין לך חשבון.
נמאס לכם לגלול בין אותם הפוסטים בכל ביקור? כשנרשמים לחשבון, תמיד תחזרו בדיוק למקום שבו הייתם קודם, ותוכלו לבחור לקבל התראות על תגובות חדשות (בין אם במייל, ובין אם בהתראת פוש). תוכלו גם לשמור סימניות ולפרגן ב-upvote לפוסטים כדי להביע הערכה לחברי קהילה אחרים.
בעזרת התרומה שלך, הפוסט הזה יכול להיות אפילו טוב יותר 💗
הרשמה התחברות