Bagaimana bekerja dengan refleksi di C #

Refleksi di C # digunakan untuk mengambil metadata pada tipe saat runtime. Dengan kata lain, Anda dapat menggunakan refleksi untuk memeriksa metadata dari tipe dalam program Anda secara dinamis - Anda dapat mengambil informasi tentang rakitan yang dimuat dan tipe yang ditentukan di dalamnya. Refleksi di C # mirip dengan RTTI (Runtime Type Information) dari C ++.

Untuk bekerja dengan refleksi di .Net, Anda harus menyertakan namespace System.Reflection dalam program Anda. Dalam menggunakan refleksi, Anda mendapatkan objek dengan tipe "Type" yang dapat digunakan untuk merepresentasikan rakitan, tipe, atau modul. Anda dapat menggunakan refleksi untuk membuat instance dari suatu tipe secara dinamis dan bahkan memanggil metode dari tipe tersebut.

Jenis yang ditentukan dalam namespace System.Reflection termasuk yang berikut ini.

  • Majelis
  • Modul
  • Enum
  • MethodInfo
  • ConstructorInfo
  • MemberInfo
  • ParameterInfo
  • Tipe
  • FieldInfo
  • EventInfo
  • PropertyInfo

Sekarang mari kita gali beberapa kode untuk menerapkan refleksi. 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;

        }

    }

Potongan kode berikut menunjukkan bagaimana Anda bisa mendapatkan nama kelas dan nama namespace dari kelas Pelanggan menggunakan refleksi:

Type type = typeof(Customer);

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

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

Cuplikan kode berikut menggambarkan bagaimana Anda dapat mengambil daftar properti kelas Pelanggan dan menampilkan namanya di jendela 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);

            }

        }

Metode GetProperties () dari kelas Type mengembalikan larik bertipe PropertyInfo - ini sebenarnya adalah daftar properti publik dari tipe Anda. Anda kemudian dapat mengulang larik ini dan mengambil nama dari setiap properti publik yang ditentukan dalam tipe Anda. Karena kelas Pelanggan mendefinisikan tiga properti, nama dari ketiga properti ini akan ditampilkan di konsol ketika program ini dijalankan.

Inilah cara kita menampilkan metadata dari konstruktor dan metode publik dari suatu tipe menggunakan refleksi. Mari kita mengunjungi kembali kelas Pelanggan yang kita buat sebelumnya dan menggabungkan dua metode - konstruktor default dan metode yang disebut Validasi yang digunakan untuk memvalidasi objek pelanggan yang diteruskan ke sana sebagai parameter. Seperti inilah versi kelas Pelanggan yang dimodifikasi akan terlihat.

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;

        }

    }

Potongan kode berikut dapat digunakan untuk menampilkan nama semua konstruktor milik kelas Pelanggan. Kami hanya memiliki satu konstruktor di kelas Pelanggan - oleh karena itu, hanya satu yang akan dicantumkan.

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 bahwa metode GetConstructors () dari kelas Jenis mengembalikan larik jenis ConstructorInfo yang berisi daftar semua konstruktor publik yang ditentukan dalam jenis yang sedang direfleksikan.

BAIK; sekarang mari kita tampilkan nama semua metode publik dari kelas Pelanggan - sekali lagi, kita hanya memiliki satu sehingga nama dari satu metode saja akan ditampilkan di konsol ketika program yang diberikan selanjutnya dijalankan. Berikut daftar kode untuk referensi 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 bahwa Anda mungkin mendapatkan nama beberapa metode tambahan (ToString, Equals, GetHashCode, GetType) ditampilkan juga. Metode ini diwarisi dari kelas Objek - kelas apa pun di .Net memperoleh kelas Objek secara default.

Anda juga dapat melakukan iterasi melalui atribut metode. Jika atribut khusus telah ditentukan untuk metode Anda, Anda dapat menggunakan metode GetCustomAttributes pada instance kelas MethodInfo untuk mengambil atribut metode tersebut. Inilah cara Anda mencapai ini.

foreach (MethodInfo temp in methodInfo)

 {

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

     {

         //Write your usual code here

     }

  }

Jadi, jika Anda mendekorasi objek bisnis Anda menggunakan atribut dalam aplikasi Anda, Anda dapat memanfaatkan refleksi untuk merefleksikan tipenya, mengambil atribut metode tipe Anda dan kemudian melakukan beberapa tindakan yang sesuai.