ראינו בעבר כיצד אפשר להשתמש בReflection כדי להשיג MethodInfo/PropertyInfo של מתודה או Property נתון. (ראו גם טיפים 146,147,158)
הבעיה בעסק הזה היא שאנחנו מקבלים הרבה stringים Hard-Coded שמייצגים את השם של האלמנט שאנחנו מעוניינים להשיג בReflection.
מה הבעיה בזה? ובכן, זה מתקמפל, אבל לא בהכרח עובד. אם השמות של המתודות/Properties האלה ישתנו, אז הקוד עדיין יתקמפל, אבל נעוף בזמן ריצה.
בניגוד לTypeים שיש בשבילם את הKeyword ששמו typeof, אין מקבילה למתודות/Properties המאפשרת לנו להשיג אותם בצורה שהיא Typed safe.
אפשר להשתמש בExpression Trees כדי להשיג את השמות האלה בצורה אחרת:
|
|
נוכל אפילו לכתוב מתודה סטטית גנרית נחמדה שתעשה את זה בצורה יפה:
|
|
ולקרוא לה כך:
|
|
בקשר למתודות, נוכל לעשות משהו דומה:
|
|
ולהשתמש בה כך:
נניח שיש לנו את המתודה הזאת:
|
|
אזי נשתמש במתודה GetMethod כך:
|
|
שימו לב שאין פה stringים שהם Hard Coded. במידה והפונקציה תחליף שם או חתימה, הקוד לא יתקמפל.
במידה ונרצה לבצע אותו הדבר למתודות שהן סטטיות/שאינן מחזירות ערך, נצטרך להוסיף Overloadים מתאימים.
שימו לב לעוד דבר – מאחר וזה Expression Tree והוא צריך להיות ביטוי שמתקמפל – אנחנו חייבים להעביר ערכים לפונקציה. אפשר לכתוב סתם ערכים, למשל:
|
|
מה שדי דוחה, אבל אפשר להפוך את החיסרון ליתרון! מאחר ואנחנו חייבים לציין ערכים – נציין את הדיפולטים של הערכים שאנחנו מחפשים (ראו למעלה), וככה נקבל את החתימה המדויקת שאנחנו מחפשים! 😃
שימו לב שבשיטה הזאת אנחנו לא מסוגלים לגשת לMemberים שהם לא חשופים לנו (למשל, private מחוץ למחלקה שלנו). יש לזה גם יתרונות, כמובן.
סופ"ש מצוין