174. Expression{TDelegate}.Compile

הכרנו בפעם שעברה את המושג של Expression Trees בC#.

אחד הדברים השימושיים שאפשר לעשות עם Expressionים מסוג Lambda Expression זה לקמפל אותם למתודה חיות.

למשל, אם ניקח את הדוגמה של אתמול נוכל לעשות משהו כזה:

1
2
3
4
5
6
7
Expression<Func<int, int, int>> sumOfSquaresExpression =
(x, y) => x * x + y * y;
Func<int, int, int> sumOfSquaresFunction =
sumOfSquaresExpression.Compile();
int fiveSquared = sumOfSquaresFunction(3, 4); // 25

על מה הריגוש בדיוק? הרי יכולנו לכתוב פשוט

1
2
Func<int, int, int> sumOfSquaresFunction =
(x, y) => x * x + y * y;

אם נזכר במה שראינו אתמול, הקוד מתקמפל לדבר הזה

1
2
3
4
5
6
7
8
9
10
11
Expression<Func<int, int, int>> sumOfSquaresExpression =
Expression.Lambda<Func<int, int, int>>(
Expression.Add(
Expression.Multiply(parameterX, parameterX),
Expression.Multiply(parameterY, parameterY)),
new ParameterExpression[] {parameterX, parameterY});
Func<int, int, int> sumOfSquaresFunction =
sumOfSquaresExpression.Compile();
int fiveSquared = sumOfSquaresFunction(3, 4); // 25

מה שקורה כאן זה שאנחנו מקמפלים Expression Tree לAnonymous Delegate.

הכוח האמיתי כאן הוא שאנחנו יכולים ליצור Expression Tree משלנו בצורה דינאמית בזמן ריצה ואז לקמפל ולהפעיל אותו.

נראה דוגמאות לזה בהמשך.

יום טוב

שתף