כיצד לעבוד עם השתקפות ב- C #

השתקפות ב- C # משמשת לאחזור מטא נתונים על סוגים בזמן הריצה. במילים אחרות, אתה יכול להשתמש בבבואה כדי לבדוק מטא נתונים של הסוגים בתוכנית שלך באופן דינמי - אתה יכול לאחזר מידע על המכלולים הטעונים והסוגים המוגדרים בהם. השתקפות ב- C # דומה ל- RTTI (מידע סוג זמן ריצה) של C ++.

כדי לעבוד עם השתקפות ב- .Net, עליך לכלול את מרחב השמות System.Reflection בתוכנית שלך. בשימוש בהשתקפות מקבלים אובייקטים מהסוג "סוג" שבעזרתם ניתן לייצג מכלולים, סוגים או מודולים. אתה יכול להשתמש בבבואה כדי ליצור מופע מסוג באופן דינמי ואף להפעיל שיטות מהסוג.

הסוגים המוגדרים במרחב השמות System.Reflection כוללים את הבאים.

  • הַרכָּבָה
  • מודול
  • Enum
  • MethodInfo
  • ConstructorInfo
  • MemberInfo
  • ParameterInfo
  • סוּג
  • FieldInfo
  • EventInfo
  • PropertyInfo

בואו נחפור בקוד כלשהו בכדי לממש השתקפות לפעולה. שקול את המעמד הבא שנקרא לקוח.

public class Customer

    {

        public int Id

        {

            get; set;

        }

        public string FirstName

        {

            get; set;

        }

        public string LastName

        {

            get; set;

        }

        public string Address

        {

            get; set;

        }

    }

קטע הקוד הבא מראה כיצד ניתן להשיג את שם הכיתה ואת שם מרחב השמות של מחלקת הלקוחות באמצעות השתקפות:

Type type = typeof(Customer);

Console.WriteLine("Class: " + type.Name);

Console.WriteLine("Namespace: " + type.Namespace);

קטע הקוד הבא ממחיש כיצד ניתן לאחזר את רשימת המאפיינים של מחלקת הלקוחות ולהציג את שמותיהם בחלון המסוף:

static void Main(string[] args)

        {

            Type type = typeof(Customer);

            PropertyInfo[] propertyInfo = type.GetProperties();

            Console.WriteLine("The list of properties of the Customer class are:--");

            foreach (PropertyInfo pInfo in propertyInfo)

            {

                Console.WriteLine(pInfo.Name);

            }

        }

שיטת GetProperties () של המחלקה Type מחזירה מערך מסוג PropertyInfo - זו למעשה רשימה של המאפיינים הציבוריים מהסוג שלך. לאחר מכן תוכל לחזור על מערך זה ולאחזר את השמות של כל אחד מהנכסים הציבוריים שהוגדרו בסוג שלך. מכיוון שמחלקת הלקוחות מגדירה שלושה מאפיינים, השמות של כל שלושת המאפיינים הללו יוצגו במסוף בעת ביצוע תוכנית זו.

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

public class Customer

    {

        public Customer()

        {

            //Default constructor

        }

        public int Id

        {

            get; set;

        }

        public string FirstName

        {

            get; set;

        }

        public string LastName

        {

            get; set;

        }

        public string Address

        {

            get; set;

        }

        public bool Validate(Customer customerObj)

        {

            //Code to validate the customer object

            return true;

        }

    }

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

Type type = typeof(Customer);           

ConstructorInfo[] constructorInfo = type.GetConstructors();

Console.WriteLine("The Customer class contains the following Constructors:--");

foreach (ConstructorInfo c in constructorInfo)

  {

     Console.WriteLine(c);

  }

שים לב ששיטת GetConstructors () מהמחלקה Type מחזירה מערך מסוג ConstructorInfo המכיל את רשימת כל הבונים הציבוריים שהוגדרו בסוג המשתקף.

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

static void Main(string[] args)

 {

    Type type = typeof(Customer);

    MethodInfo[] methodInfo = type.GetMethods();

     Console.WriteLine("The methods of the Customer class are:--");

            foreach (MethodInfo temp in methodInfo)

            {

              Console.WriteLine(temp.Name);               

            }

            Console.Read();

        }

שים לב שאולי יוצגו גם שמות של כמה שיטות נוספות (ToString, Equals, GetHashCode, GetType). שיטות אלה עוברות בירושה מהמחלקה Object - כל מחלקה ב- .Net נגזרת מהמחלקה Object כברירת מחדל.

אתה יכול גם לחזור על המאפיינים של שיטה. אם הוגדרו תכונות מותאמות אישית לשיטות שלך, תוכל להשתמש בשיטת GetCustomAttributes במופע המחלקה MethodInfo כדי לאחזר את התכונות של השיטה. כך תוכל להשיג זאת.

foreach (MethodInfo temp in methodInfo)

 {

    foreach (Attribute attribute in temp.GetCustomAttributes(true))

     {

         //Write your usual code here

     }

  }

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