230. Generic methods and dynamic binding

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

קריאה דינאמית לפונקציה מאפשרת לנו לקרוא בזמן ריצה לOverload המתאים ביותר לפרמטרים שאנחנו שולחים.

מה שאולי לא הכי טריוויאלי מהסיפור הזה, הוא שאפשר גם לקרוא בצורה דינאמית לפונקציה גנרית ככה:

למשל, נניח שיש לנו פונקציה כזאת:

1
2
3
4
5
6
7
8
9
10
11
12
13
public static T FirstOrDefault<T>(IEnumerable<T> enumerable)
{
IEnumerator<T> enumerator = enumerable.GetEnumerator();
if (!enumerator.MoveNext())
{
return default(T);
}
else
{
return enumerator.Current;
}
}

אז אם נכתוב קוד כזה:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
object acceptableNames =
new string[]
{
"Jason",
"Jefferson",
"Jackson",
"Washington",
"Washington Santos",
"Ferguson",
"Robert Louis Stevenson",
"Michael",
"Jacobs"
};
object result = FirstOrDefault((dynamic) acceptableNames); // Jason

מה שקורה בעצם זה שבזמן ריצה מתבצע חיפוש של הOverload המתאים ביותר.

בנוסף החיפוש של המתודה המתאימה ביותר מתבצע תוך כדי התחשבות בפרמטר הגנרי, כמו שקריאה לפונקציה עם פרמטר גנרי Implicitly בזמן קימפול מוצאת את הOverload הטוב ביותר, ויודעת למצוא את הפרמטר הגנרי Implicitly. (ראו גם טיפ מספר 28)

אז גם כאן, נשלח הפרמטר הגנרי של הפונקציה באופן שקוף, לפי הפרמטר המתאים ביותר בזמן ריצה.

שיהיה סופ"ש דינאמי גנרי טוב!

שתף