C# 4.0 Part 5 - Behind The Scenes Part 2
אז אחרי שהבנו
אתמול Expression Tree והבנו
שלשום שלמעשה כל dynamic הוא object, כעת נראה מה קורה כשעושים פעולות על dynamic.
מה לדעתכם מתרנדר כשכותבים את הקוד הבא:
int i = 10;
dynamic d = i;
d++;
למעשה מה שקורה זה הקוד הבא (בערך - כי שיניתי את השמות של המשתנים)
private static class SiteContainer
{
public static CallSite<Func<CallSite, object, object>> p1;
}
static void Main(string[] args)
{
if (SiteContainer.p1 == null)
{
SiteContainer.p1 = CallSite<Func<CallSite, object, object>>.Create(
new CSharpUnaryOperationBinder(
ExpressionType.Increment,
false,
new CSharpArgumentInfo[] {
new CSharpArgumentInfo(CSharpArgumentInfoFlags.None, null) }));
}
d = SiteContainer.p1.Target.Invoke(SiteContainer.p1, d);
}
טיפה מסובך, אבל לא נורא.
למעשה נוצר לנו class סטטי שמכיל אובייקט מסוג CallSite (שהוא בסך הכל אובייקט שאמור לקבל delegate) סוג ה - delegate שנוצר תלוי כמובן לפי הפעולה שאנחנו מנסים לעשות. כשמפעילים מתודות נוצר delegate (לפעמים) מסוג Action.
ב - Main בודקים האם כבר יצרנו את אותו משתנה סטטי, במידה ולא, מייצרים אותו. וכאן יש המון עבודה של הקומפיילר שצריך לייצר את הקוד, ולמעשה כל האובייקטים שמסתיימים עם Binder למעשה בונים Expression שניתן לקמפל ולהריץ.
בשורה האחרונה מריצים את המתודה של ה - delegate והפעולה מתבצעת.
מה שחושב כאן להבין, שאין קסמים, כשעושים פעולות על dynamic למעשה מתרנדר קוד שבסופו של דבר יוצר Expression שמתאר את הקוד שאנחנו רוצים להריץ.
אפשר לחפור בנושא הזה הרבה יותר עמוק, אבל אני מרגיש שזה יפספס את המטרה של סדרת הפוסטים, שהיא - מעבר על התכונות החדשות של C# 4.0 והבנה איך זה עובד מאחורי הקלעים, כשאגמור עם סדרת הפוסטים אני אחזור לנושא הזה ונכנס הרבה יותר עמוק בכל מה שקשור ל - Binders למיניהם. (מה זה Binder מה הוא מכיל, ירושה והרחבה של הפונקציונליות, ועוד)
הפוסט הבא יראה איך אפשר להגדיר ל - DLR על אובייקט מסוים להתנהג בצורה אחרת כשמשתמשים ב - dymanic עליו, לדוגמא - עם יש לנו אובייקט שמכיל xml, נוכל לגשת על האלמנטים שלו כאילו הם מאפיינים ולא נצטרך לגשת דרך indexer. וזאת על ידי ירושה מ - DynamicObject.
ועל כך בפוסט הבא (מחר בעזרת ה')