Latest web development tutorials

C # refleksi (Reflection)

Refleksi berarti bisa mengakses program, kemampuannya untuk mendeteksi dan memodifikasi negara mereka sendiri atau perilaku.

Majelis berisi modul, yang berisi jenis, yang pada gilirannya berisi anggota. Refleksi memberikan paket objek majelis, modul dan jenis.

Anda dapat menggunakan refleksi untuk secara dinamis membuat sebuah instance dari tipe, jenis terikat ke sebuah obyek yang ada, atau mendapatkan jenis dari objek yang ada. Anda kemudian dapat memanggil jenis pendekatan atau mengakses bidang dan sifat.

Pro dan kontra

keuntungan:

  • 1, mencerminkan peningkatan fleksibilitas proses dan skalabilitas.
  • 2, mengurangi kopling, meningkatkan kapasitas adaptif.
  • 3, yang memungkinkan program untuk membuat dan mengendalikan semua jenis objek, tanpa terlebih dahulu kelas Target keras-kode.

kekurangan:

  • 1, masalah kinerja: penggunaan pada dasarnya adalah refleksi menjelaskan operasi, ketika bidang dan metode untuk akses ke lebih lambat dari kode langsung. Dengan demikian refleksi pada fleksibilitas aplikasi utama dan skalabilitas menuntut kerangka, prosedur umum tidak dianjurkan.
  • 2, penggunaan refleksi kabur dalam logika program; programmer ingin melihat logika dalam kode sumber, tetapi refleksi melewati teknologi kode sumber, yang akan membawa masalah pemeliharaan, dan kode refleksi lebih kompleks dari kode yang sesuai secara langsung .

Reflex (Refleksi) penggunaan

Reflex (Refleksi) untuk tujuan berikut:

  • Hal ini memungkinkan Anda untuk melihat properti saat runtime (atribut) informasi.
  • Hal ini memungkinkan meninjau koleksi berbagai jenis, serta contoh jenis ini.
  • Hal ini memungkinkan terlambat mengikat metode dan properti (properti).
  • Hal ini memungkinkan penciptaan tipe baru pada waktu berjalan, dan kemudian menggunakan jenis ini melakukan beberapa tugas.

Lihat Metadata

Kami telah menyebutkan di bagian atas, penggunaan refleksi (Refleksi) dapat melihat properti (atribut) informasi.

ObjekSystem.Reflection MemberInfokelas perlu diinisialisasi, untuk menemukan properti yang berhubungan dengan kelas (atribut). Untuk melakukan ini, Anda dapat mendefinisikan kelas objek target, sebagai berikut:

System.Reflection.MemberInfo Info = typeof (MyClass);

Program berikut menunjukkan titik ini:

menggunakan System;

[AttributeUsage (AttributeTargets.All)]
public class HelpAttribute: System.Attribute
{
   publik dibaca tali Url;

   public string Topic // Topik adalah bernama (nama) parameter {
      mendapatkan
      {
         kembali topik;
      }
      set
      {

         topic = nilai;
      }
   }

   publik HelpAttribute (string url) // url adalah positioning (posisi) parameter {
      this.Url = url;
   }

   tali topik swasta;
}
[HelpAttribute ( "Informasi tentang MyClass class")]
class MyClass
{
}

AttributeAppl namespace
{
   Program kelas
   {
      static void Main (string [] args)
      {
         System.Reflection.MemberInfo Info = typeof (MyClass);
         objek [] atribut = info.GetCustomAttributes (true);
         for (int i = 0; i <attributes.Length; i ++)
         {
            System.Console.WriteLine (atribut [i]);
         }
         Console.ReadKey ();

      }
   }
}

Ketika kode di atas dikompilasi dan dijalankan, maka akan muncul sifat khusus yang melekat padaMyClasskelas pada:

HelpAttribute

contoh

Dalam contoh ini, kita akan menggunakan propertidebuginfodibuat dalam bab terakhir, dan menggunakan refleksi (Reflection) untuk membaca metadata kelasRectangle.

menggunakan System;
menggunakan System.Reflection;
namespace BugFixApplication
{
   // Bugfix properti kustom ditugaskan untuk kelas dan anggotanya [AttributeUsage (AttributeTargets.Class |
   AttributeTargets.Constructor |
   AttributeTargets.Field |
   AttributeTargets.Method |
   AttributeTargets.Property,
   AllowMultiple = true)]

   public class debuginfo: System.Attribute
   {
      private int Bugno;
      pengembang private string;
      tali lastReview swasta;
      Pesan public string;

      publik debuginfo (int bg, tali dev, tali d)
      {
         this.bugNo = bg;
         this.developer = dev;
         this.lastReview = d;
      }

      public int Bugno
      {
         mendapatkan
         {
            kembali Bugno;
         }
      }
      publik tali Developer
      {
         mendapatkan
         {
            kembali pengembang;
         }
      }
      public string LastReview
      {
         mendapatkan
         {
            kembali lastReview;
         }
      }
      Pesan public string
      {
         mendapatkan
         {
            kembali pesan;
         }
         set
         {
            Pesan = nilai;
         }
      }
   }
   [Debuginfo (45, "Zara Ali", "2012/12/08",
	Pesan = "Kembali type mismatch")]
   [Debuginfo (49, "Nuha Ali", "2012/10/10",
	Pesan = "tidak digunakan variabel")]
   kelas Rectangle
   {
      // Variabel Anggota dilindungi panjang ganda;
      dilindungi lebar ganda;
      Rectangle publik (double l, ganda w)
      {
         panjang = l;
         width = w;
      }
      [Debuginfo (55, "Zara Ali", "19/10/2012",
	   Pesan = "Kembali type mismatch")]
      publik GetArea ganda ()
      {
         kembali panjang * lebar;
      }
      [Debuginfo (56, "Zara Ali", "19/10/2012")]
      public void Tampilan ()
      {
         Console.WriteLine ( "Panjang: {0}", panjang);
         Console.WriteLine ( "Lebar: {0}", lebar);
         Console.WriteLine ( "Area: {0}", GetArea ());
      }
   } // End class Rectangle  
   
   kelas ExecuteRectangle
   {
      static void Main (string [] args)
      {
         Rectangle r = Rectangle baru (4.5, 7.5);
         r.Display ();
         Jenis Jenis = typeof (Rectangle);
         // Traverse kelas Rectangle atribut foreach (atribut Object di type.GetCustomAttributes (palsu))
         {
            Debuginfo dbi = (debuginfo) atribut;
            jika (null! = dbi)
            {
               Console.WriteLine ( "Bug no: {0}", dbi.BugNo);
               Console.WriteLine ( "Pengembang: {0}", dbi.Developer);
               Console.WriteLine ( "terakhir pada: {0}",
					dbi.LastReview);
               Console.WriteLine ( "Keterangan: {0}", dbi.Message);
            }
         }
         
         // Metode Iterate atribut foreach (MethodInfo m di type.GetMethods ())
         {
            foreach (Atribut di m.GetCustomAttributes (benar))
            {
               Debuginfo dbi = (debuginfo) a;
               jika (null! = dbi)
               {
                  Console.WriteLine ( "Bug no: {0}, untuk Metode: {1}",
						dbi.BugNo, m.Name);
                  Console.WriteLine ( "Pengembang: {0}", dbi.Developer);
                  Console.WriteLine ( "terakhir pada: {0}",
						dbi.LastReview);
                  Console.WriteLine ( "Keterangan: {0}", dbi.Message);
               }
            }
         }
         Console.ReadLine ();
      }
   }
}

Ketika kode di atas dikompilasi dan dijalankan, menghasilkan hasil sebagai berikut:

Panjang: 4,5
Lebar: 7.5
Area: 33,75
Bug No: 49
Pengembang: Nuha Ali
Terakhir pada: 2012/10/10
Keterangan: variabel yang tidak digunakan
Bug No: 45
Pengembang: Zara Ali
Terakhir pada: 2012/12/08
Keterangan: Jenis Kembali mismatch
Bug No: 55, untuk Metode: GetArea
Pengembang: Zara Ali
Terakhir pada: 19/10/2012
Keterangan: Jenis Kembali mismatch
Bug No: 56, untuk Metode: Tampilan
Pengembang: Zara Ali
Terakhir pada: 19/10/2012
Keterangan: