אחד הדברים המגניבים ביותר שאפשר לעשות בnet הוא לכתוב קוד שמסוגל לחלץ מידע על קוד שכתבנו.
כאשר התוכנה שלנו מתקמפלת, חלק מהמידע בה נעלם, כגון שמות של משתנים לוקאליים והערות, אבל רוב המידע נשאר נגיש. (למשל שמות של מחלקות שלנו והMemberים שלהן)
קיימת לנו גישה למידע זה, הנקרא גם Metadata, באמצעות Reflection המאפשר לנו לקבל מחלקות המתארות את המידע בו אנחנו מעוניינים.
נכיר בטיפ זה את Type – טיפוס של הFramework המתאר טיפוסים אחרים, ואת הkeyword ששמו typeof.
כאמור המחלקה Type מתארת טיפוסים netים אחרים. השימוש הפשוט ביותר במחלקה זו הוא באמצעות הkeyword ששמו typeof:
|
|
ככה קיבלנו instance של Type המתאר את הטיפוס int.
נוכל לעשות כל מיני דברים נחמדים כמו:
|
|
או להדפיס, למשל, את כל הממשקים שהוא מממש:
|
|
את הKeyword ששמו typeof ניתן להפעיל על כל טיפוס שידוע בזמן קימפול, והנה מספר דוגמאות:
|
|
הדוגמה האחרונה היא יותר חריגה, מאחר ואם ננסה לכתוב קוד כזה:
|
|
הוא לא יתקמפל. בJava, קיים פתרון באמצעות Wildcards. בC# אין פתרון לדבר כזה בזמן קימפול, אבל באמצעות Reflection אפשר לעשות דברים דומים לזה בזמן ריצה.
קצת בקשר לFullName: ראינו בדוגמה למעלה שהדפסה של FullName של טיפוס נראית בעצם כמו שרשור של הNamespace שלו עם הName שלו.
הדבר נכון בד"כ, אבל יש שני מקרים בהם הוא לא נכון:
- עבור טיפוסים מקוננים (Nested Types), למשל:
|
|
נקבל:
|
|
- עבור טיפוסים גנריים: נקבל בName את שם המחלקה משורשרת עם ` שאחריו מופיע את מספר הארגומנטים הגנריים:
|
|
אבל בFullName נקבל משהו קצת אחר:
|
|
שימו לב שמצוינים בסוגריים הטיפוסים הגנריים
- אם הטיפוס הגנרי היה unbound, כלומר בלי פרמטרים גנריים מצוינים, היינו באמת מקבלים משהו כזה:
|
|
שיהיה שבוע טיפוסי (עד כמה שאפשר)