לפעמים אנחנו מעוניינים לדעת האם Type מסוים הוא תת-טיפוס של Type נתון (כלומר, יורש מהType נתון, או מממש את הType נתון).
לכאורה נראה שיש פתרון פשוט לזה, באמצעות הפונקציה IsSubclassOf. אלא שפונקציה זו עושה בעיות במקרים הבאים:
- אם הטיפוסים שווים, היא תחזיר false.
לדוגמה:
|
|
- אם הטיפוס שאנחנו רוצים לבדוק, האם הטיפוס השני יורש ממנו, הוא ממשק, נקבל false.
לדוגמה, אם יש לנו מחלקה כזאת:
|
|
לא נכנס לתנאי (באופן אולי מפתיע)
|
|
- בשאר המקרים (מחלקה שיורשת ממחלקה), הדבר הזה כן יעבוד:
|
|
כדי שבכל זאת נוכל לבדוק האם טיפוס יורש (במובן הC#י החלש - כלומר מממש/יורש/שווה) מטיפוס אחר, קיימת פונקציה אחרת בשם IsAssignableFrom. פונקציה זו היא פונקציה של Type המקבלת Type שני, ובודקת האם הType השני "יורש" (במובן הC#י החלש) מהType הראשון, או במילים אחרות, האם אפשר להסב (בהסבה סטנדרטית) את הטיפוס השני לטיפוס הראשון. לדוגמא:
|
|
שימו לב! יש פה דבר קצת מבלבל – אם קודם שמנו את הטיפוס שאנחנו מעוניינים לבדוק שיורשים ממנו בתור הפרמטר השני, עכשיו הוא הפרמטר הראשון – להשוואה:
typeof(Shape).IsAssignableFrom(typeof(Circle)) לעומת typeof(Circle).IsSubclassOf(typeof(Shape)).
המשך יום טיפוסי טוב