375. Accessing default arguments values

ראינו בטיפ מספר 243 את הFeature שנוסף בC# 4.0 המאפשר לנו לציין ערכים דיפולטיים למתודה שלנו, מבלי לייצר הרבה Overloadים.

ראינו שמאחורי הקלעים מה שנעשה הוא פשוט הכנסה Hard-Coded של ערכים אלו בכניסה לפונקציה.


קיים באינטרנט Framework בשם ASP.net MVC 4. Framework זה מאפשר לנו לבנות אתרי אינטרנט בצורה מאוד נוחה. (אם מישהו מכיר Ruby on rails – Asp.net MVC הוא החיקוי של מיקרוסופט לROR)

אחד הדברים המגניבים שעשו שם זה להגדיר שבמידה וניגשים לurl מסוים, התשתית יודעת לפרסר את הurl לController (מחלקה) המתאים ולפונקציה המתאימה עם הפרמטרים המתאימים. למשל אם ניגש ל

http://localhost:2134/pet/getage/Dog

תתבצע גישה למחלקה PetController למתודה GetAge עם הפרמטר “Dog”.

בנוסף אם ניגש ל

http://localhost:2134/pet/getlastpets/3?type=Dog

יבצע לנו קריאה למחלקה PetController למתודה GetLastPets עם הארגומנטים “Dog” ו3.


מה שמעניין בכל הסיפור הזה זה שאם יש לנו ארגומנטים עם ערכים דיפולטיים – אז התשתית תדע לקרוא למתודה שלנו עם ערכים דיפולטיים. כלומר אם ניגש לUrl הזה

http://localhost:2134/pet/getlastpets/3

ויש למתודה GetLastPets ערך דיפולטי עבור הפרמטר type, תתבצע גישה עם הערך הדיפולטי של type.

רציתי לדעת איך הדבר הזה מממומש.

מסתבר שבReflection יש לParameterInfo את הProperties הבאים:

1
2
3
4
5
6
7
ParameterInfo[] parameters = methodInfo.GetParameters();
ParameterInfo parameter = parameters[1];
bool isOptional = parameter.IsOptional;
object defaultValue = parameter.DefaultValue;

מה שקורה זה שIsOptional מחזיר לנו האם לפרמטר יש ערך דיפולטי, וDefaultValue מביא לנו את הערך הדיפולטי.


אם תסתכלו אחורה, תראו שגם בFrameworkים הקודמים היו את הProperties האלה. איך זה יכול להיות?

ובכן, Reflection הוא לא ספציפי לC# - מסתבר שיש שפה שהיא אחות של C# בשם VB.net, שם היו פרמטרים דיפולטיים גם לפני Framework 4.0, וזו הייתה הדרך לגשת אליהם.


בקיצור, יש פה הרבה כוח שאפשר לנצל, במיוחד לתשתיות שיכולות להסתכל על הפרמטרים הדיפולטיים האלה ולעשות איתם משהו.

שבוע עם פרמטרים דיפולטיים טוב.

שתף