ריפלקשן זה היכולת לשקף בזמן ריצה את מבנה הקוד
איך עושים את זה? ע"י שימוש בקלאסים פרופרטים ומתודות שמיועדים לזה, והם נמצאים (בעיקר) בניימספייס System.Reflection, אבל זה למעשה מובנה לתוך סביבת העבודה, ככה שאתה יכול גם לגבי משתנה מסויים שאתה עובד איתו, לקבל את ה-Type שלו (ע"י שימוש במתודה GetType שכל הקלאסים יורשים מ-object) ומתוך זה, אתה יכול לדעת באיזה אסמבלי הוא נמצא, מאיזה קלאס הוא באמת (אם יש לך למשל מופע של ISomeInterfaceImplementation אז אתה יכול לדעת מי הקלאס שלמעשה מממש את האינטרפייס הזה) איזה מתודות יש לו (כולל פרוטקטד ופרייבט), וכמובן גם לקרוא למתודות האלה.
מה שזה מאפשר זה לגשת לדברים באובייקט, בזמן ריצה, שאין לך מושג בזמן הקומפילציה מה הם יהיו.
הזרקת תלויות (dependency Injection שקרוי בקיצור DI) זה design pattern מסוג creational כלומר הוא נוגע בתחום של יצירת האובייקטים, ועיקר השיטה הוא שמייצרים קונטיינר, שהוא האחראי על יצירת האובייקטים, ובקונסטרקטור (אם בעזרת אטריביוטים על פרופרטים) מגדירים איזה תלויות יש לאובייקט מסויים שצריך לספק אותן, ולמעשה בתחילת ריצת התוכנית מגדירים לקונטיינר איך לספק כל תלות (למשל תלות מסויימת תהיה shared כלומר מעין סינגלטון, תלות אחרת נספק כאובייקט שתלוי בסשן, תלות אחרת תסופק בהתאם לסוג האובייקט שיוצרים, וכן הלאה).
במימושים שונים שקיימים בשוק של DI, מעצם ההגדרה של איך הוא עובד, לרוב משתמשים ב-reflection, אבל זה רק מטעמי נוחות וזה לא הכרח ואין למעשה קשר בין השניים
בברכה,
זיו