C# 4.0 Part 4 - Understanding Expression Tree
אז
בפוסט הקודם ראינו שלמעשה אין ב - Runtime טיפוס dynamic, וכל מה שאנחנו משימים לתוך dynamic עובר להיות object.
בפוסט הזה הייתי רוצה להראות מה קורה מאחורי הקלעים כשעושים פעולות על אובייקט מסוג dynamic.
אבל - כדי להבין את הקוד שמתרנדר חייבים הבנה בסיסית ב - Expression Tree היות שכל המנגנון עובד עם Expression. ולכן בפוסט הזה אסביר על expression tree ובפוסט הבא נכנס למה שקורה מאחורי הקלעים.
כשהתחלתי ללמוד את C# 4.0 והבנתי שאני חייב להבין קודם Expression Tree, הגעתי
לפוסט המצויין הזה, ואני ממליץ לכולם לקרוא אותו.
למעשה מייקרוסופט המציאו את ה - Expression Tree עבור Linq To Sql, כי הם חיפשו דרך נוחה לתאר קוד (כל ההסברים אודות LINQ נמצאים בפוסט שהפניתי לעיל)
נראה את הקוד הבא:
Func<int, int, int> function = (int a, int b) => a + b;
או אם ננסה לפשט את זה -
Func<int, int, int> function = execFunc;
public static int execFunc(int a, int b)
{
return a + b;
}
שני קטעי הקוד הם כמובן זהים - השאלה איך ניתן לתאר את הקוד הזה, הרי זה קוד מקומפל ואנחנו מחפשים דרך לתאר קוד בצורה היררכית, וכאן נכנס המושג expression לתמונה.
ParameterExpression left = Expression.Parameter(typeof(int), "a");
ParameterExpression right = Expression.Parameter(typeof(int), "b");
BinaryExpression body = Expression.Add(left, right);
LambdaExpression lamda = Expression.Lambda(typeof(Func<int, int, int>),
body, left, right);
Console.WriteLine(lamda.Compile().DynamicInvoke(2, 3));
השורה הראשונה - מייצרת ביטוי לפרמרטר בשם a מסוג int.
השורה השנייה - מייצרת ביטוי לפרמרטר בשם b מסוג int.
השורה השלישית - מייצרת ביטוי שמאחד את שני הפרמטרים כשאחד מצד ימין והשני מצד שמאל של הביטוי, והוא עצמו מתאר חיבור של שני הביטויים.
השורה הרביעית - מחזירה אובייקט מסוג LamdaExpression שמקבל כפרמטר טיפוס של delegate ואת הביטויים שמרכיבים אותו.
כעת קבלנו תיאור של קוד שמתאר קבלת שני מספרים חישוב סכומם והחזרת התוצאה.
במידה ואנחנו רוצים להריץ את הקוד, אנחנו צריכים להעביר אותו קומפליציה ולהפעיל את מתודה DynaimcInvoke.
למעשה את כל הקוד המסובך הזה אפשר להחליף אותו ב -
Expression<Func<int, int, int>> expression = (a, b) => a + b;
int res = expression.Compile()(2, 3);
הקוד הזה מייצר למעשה את כל הביטויים שיצרנו למעלה.
אחרי שהבנו קצת - מה זה Expression Tree, נוכל בפוסט הבא (שיהיה בעזרת ה' מחר) להיכנס באמת לנבכי הקוד שמתרנדר כשעושים פעולות על dynamic.