Cara bekerja dengan refleksi di C #

Refleksi dalam C # digunakan untuk mengambil metadata pada jenis pada waktu runtime. Dengan kata lain, anda boleh menggunakan refleksi untuk memeriksa metadata jenis dalam program anda secara dinamik - anda boleh mendapatkan maklumat mengenai kumpulan yang dimuat dan jenis yang ditentukan di dalamnya. Refleksi dalam C # serupa dengan RTTI (Maklumat Jenis Masa Jalan) C ++.

Untuk bekerja dengan refleksi di. Net, anda harus memasukkan ruang nama System.Reflection dalam program anda. Dalam menggunakan pantulan, anda mendapatkan objek dari jenis "Type" yang dapat digunakan untuk mewakili kumpulan, jenis, atau modul. Anda boleh menggunakan refleksi untuk membuat contoh jenis secara dinamik dan bahkan menggunakan kaedah jenisnya.

Jenis yang ditentukan dalam ruang nama System.Reflection merangkumi yang berikut.

  • perhimpunan
  • Modul
  • Enum
  • KaedahInfo
  • Maklumat Pembina
  • Maklumat Ahli
  • ParameterInfo
  • Jenis
  • Maklumat Medan
  • Maklumat Peristiwa
  • Maklumat Harta

Sekarang mari kita menggali beberapa kod untuk membuat refleksi bertindak. Pertimbangkan kelas berikut yang disebut Pelanggan.

public class Customer

    {

        public int Id

        {

            get; set;

        }

        public string FirstName

        {

            get; set;

        }

        public string LastName

        {

            get; set;

        }

        public string Address

        {

            get; set;

        }

    }

Coretan kod berikut menunjukkan bagaimana anda boleh mendapatkan nama kelas dan nama ruang nama kelas Pelanggan menggunakan refleksi:

Type type = typeof(Customer);

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

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

Coretan kod berikut menggambarkan bagaimana anda dapat mengambil senarai sifat kelas Pelanggan dan memaparkan namanya di tetingkap konsol:

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);

            }

        }

Kaedah GetProperties () dari kelas Type mengembalikan pelbagai jenis PropertyInfo - ini sebenarnya adalah senarai sifat awam jenis anda. Anda kemudian boleh mengulangi tatasusunan ini dan mengambil nama setiap sifat awam yang ditentukan dalam jenis anda. Oleh kerana kelas Pelanggan menentukan tiga sifat, nama ketiga-tiga sifat ini akan dipaparkan di konsol semasa program ini dijalankan.

Inilah cara kita dapat memaparkan metadata konstruktor dan kaedah umum dari jenis menggunakan pantulan. Mari kita kaji semula kelas Pelanggan yang kita buat sebelumnya dan menggabungkan dua kaedah - konstruktor lalai dan kaedah yang disebut Validate yang digunakan untuk mengesahkan objek pelanggan yang diteruskan kepadanya sebagai parameter. Seperti inilah versi kelas Pelanggan yang diubah suai.

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;

        }

    }

Coretan kod berikut boleh digunakan untuk memaparkan nama semua pembina yang tergolong dalam kelas Pelanggan. Kami hanya mempunyai satu pembina di kelas Pelanggan - oleh itu, hanya satu yang akan disenaraikan.

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);

  }

Perhatikan bahawa kaedah GetConstructors () dari kelas Type mengembalikan pelbagai jenis ConstructorInfo yang mengandungi senarai semua konstruktor awam yang ditentukan dalam jenis yang sedang dicerminkan.

OKEY; mari sekarang memaparkan nama-nama semua kaedah umum kelas Pelanggan - sekali lagi, kita hanya mempunyai satu sehingga nama satu kaedah akan dipaparkan di konsol ketika program yang diberikan berikutnya dijalankan. Inilah senarai kod untuk rujukan anda.

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();

        }

Perhatikan bahawa anda mungkin juga mendapat nama beberapa kaedah tambahan (ToString, Equals, GetHashCode, GetType). Kaedah ini diwarisi dari kelas Objek - mana-mana kelas di. Net memperoleh kelas Objek secara lalai.

Anda juga boleh melakukan iterasi melalui atribut kaedah. Sekiranya atribut khusus telah ditentukan untuk kaedah anda, anda dapat menggunakan metode GetCustomAttributes pada contoh kelas MethodInfo untuk mengambil atribut kaedah tersebut. Inilah cara anda dapat mencapainya.

foreach (MethodInfo temp in methodInfo)

 {

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

     {

         //Write your usual code here

     }

  }

Oleh itu, jika anda menghias objek perniagaan anda menggunakan atribut dalam aplikasi anda, anda dapat memanfaatkan refleksi untuk merenungkan jenisnya, mengambil atribut kaedah jenis anda dan kemudian melakukan beberapa tindakan yang sewajarnya.