Panduan Awal untuk Refleksi dalam C

Hai sana, bakal bintang pengkomputeran! Hari ini, kita akan memulakan sebuah perjalanan yang menarik ke dunia Refleksi C#. Jangan bimbang jika anda belum pernah menulis baris kode sebelum ini - saya akan menjadi panduannya yang ramah, dan kita akan menjelajah tema ini bersama-sama, langkah demi langkah. Pada akhir panduan ini, anda akan mempunyai pengetahuan yang kukuh tentang apa itu Refleksi dan bagaimana menggunakannya. Jadi, mari kita masuk ke dalam!

C# - Reflection

Apa Itu Refleksi?

Imajinasikan anda di sebuah restoran mewah, dan anda diberikan satu menu. Tetapi ini bukan menu biasa - ini adalah menu yang magical! Anda tidak hanya dapat melihat hidangan-hidangan, tetapi anda juga dapat melirik ke dapur untuk melihat bagaimana mereka membuatnya, bahan-bahan yang digunakan, dan bahkan mengubah resipi secara langsung. Itu adalah esensi apa yang dilakukan Refleksi dalam C#, tetapi dengan kode bukan makanan.

Dalam istilah teknikal, Refleksi adalah ciri dalam C# yang membolehkan program untuk memeriksa, berinteraksi, dan mengubah struktur serta perilaku sendiri di masa runtime. Itu seperti memberikan program anda cermin untuk melihat dirinya sendiri!

Aplikasi Refleksi

Sekarang, anda mungkin bertanya, "Mengapa saya hendak membuat program saya melihat dirinya sendiri?" Pertanyaan yang bagus! Mari kita jelajahi beberapa aplikasi praktikal Refleksi:

  1. Pemuatan asemblis secara dinamik: Refleksi membolehkan anda memuat dan menggunakan asemblis (ber fikir tentang ini sebagai paket-paket kode) yang tidak pasti diketahui ketika anda menulis program anda.

  2. Mencipta contoh jenis: Anda dapat mencipta objek jenis tertentu tanpa mengetahui jenis tepatnya pada masa kompilasi.

  3. Pemanggilan method: Refleksi membolehkan anda memanggil method pada objek secara dinamik.

  4. Mengakses dan mengubah medan dan properti: Anda dapat membaca dan menulis ke medan dan properti objek.

  5. Pemeriksaan atribut: Anda dapat memeriksa atribut (maklumat tambahan) yang dilampirkan ke elemen-elemen program berbeza.

Mari kita lihat ini lebih detil dengan beberapa contoh kode!

Contoh 1: Mencipta contoh secara dinamik

using System;
using System.Reflection;

class Program
{
static void Main()
{
// Dapatkan jenis kelas string
Type stringType = typeof(string);

// Cipta contoh string menggunakan Refleksi
object str = Activator.CreateInstance(stringType, new object[] { "Hello, Refleksi!" });

Console.WriteLine(str); // Output: Hello, Refleksi!
}
}

Dalam contoh ini, kita menggunakan Refleksi untuk cipta contoh kelas string. Itu seperti memberitahu C#, "Saya hendak cipta sesuatu, tetapi saya akan memberitahu anda apa itu pada masa runtime." Ini sangat berguna ketika anda tidak tahu jenis tepat yang anda perlukan sehingga program anda berjalan.

Contoh 2: Pemanggilan method secara dinamik

using System;
using System.Reflection;

class MyClass
{
public void SayHello(string name)
{
Console.WriteLine($"Hello, {name}!");
}
}

class Program
{
static void Main()
{
// Cipta contoh MyClass
MyClass obj = new MyClass();

// Dapatkan jenis MyClass
Type type = obj.GetType();

// Dapatkan MethodInfo untuk method SayHello
MethodInfo methodInfo = type.GetMethod("SayHello");

// Pemanggilan method
methodInfo.Invoke(obj, new object[] { "Refleksi" });
// Output: Hello, Refleksi!
}
}

Di sini, kita menggunakan Refleksi untuk memanggil method SayHello pada objek MyClass. Itu seperti memberitahu C#, "Saya tahu objek ini ada method bernama 'SayHello', sila panggilinya untuk saya." Ini sangat berguna ketika anda perlu memanggil method pada objek di mana anda tidak tahu jenis tepat pada masa kompilasi.

Melihat Metadata

Salah satu hal yang paling menarik tentang Refleksi adalah ia membolehkan kita melirik ke dalam mesin kode kami. Kita dapat melihat metadata tentang jenis-jenis, method, properti, dan banyak lagi. Mari kita lihat!

Contoh 3: Melihat metadata jenis

using System;
using System.Reflection;

class Program
{
static void Main()
{
Type stringType = typeof(string);

Console.WriteLine($"Type Name: {stringType.Name}");
Console.WriteLine($"Full Name: {stringType.FullName}");
Console.WriteLine($"Namespace: {stringType.Namespace}");
Console.WriteLine($"Is it a class? {stringType.IsClass}");
Console.WriteLine($"Base Type: {stringType.BaseType}");

Console.WriteLine("\nMethods:");
foreach (MethodInfo method in stringType.GetMethods())
{
Console.WriteLine(method.Name);
}
}
}

Kode ini seperti meminta kelas string untuk memberitahu kami tentang dirinya sendiri. Kita mendapatkan maklumat tentang namanya, namespace tempatnya berada, sama ada ia adalah kelas, jenis asasnya, dan bahkan senarai semua methodnya. Itu seperti menjalankan percakapan dengan kode anda!

Contoh Komprehensif

Mari kita gabungkan semua ini dengan contoh yang lebih kompleks yang menunjukkan aspek berbeza Refleksi:

using System;
using System.Reflection;

public class Person
{
public string Name { get; set; }
public int Age { get; set; }

public Person(string name, int age)
{
Name = name;
Age = age;
}

public void Introduce()
{
Console.WriteLine($"Hi, I'm {Name} and I'm {Age} years old.");
}
}

class Program
{
static void Main()
{
// Cipta contoh Person menggunakan Refleksi
Type personType = typeof(Person);
object[] constructorArgs = { "Alice", 30 };
Person person = (Person)Activator.CreateInstance(personType, constructorArgs);

// Dapatkan dan set nilai properti menggunakan Refleksi
PropertyInfo nameProperty = personType.GetProperty("Name");
PropertyInfo ageProperty = personType.GetProperty("Age");

Console.WriteLine($"Current Name: {nameProperty.GetValue(person)}");
nameProperty.SetValue(person, "Bob");
ageProperty.SetValue(person, 25);

// Pemanggilan method menggunakan Refleksi
MethodInfo introduceMethod = personType.GetMethod("Introduce");
introduceMethod.Invoke(person, null);

// Papar semua method kelas Person
Console.WriteLine("\nMethods of Person class:");
foreach (MethodInfo method in personType.GetMethods())
{
Console.WriteLine(method.Name);
}
}
}

Contoh ini menunjukkan ciptaan objek, mendapatkan dan menset nilai properti, pemanggilan method, dan senarai semua method kelas, semua menggunakan Refleksi. Itu seperti kita menjadi manipulator, mengawal objek Person sepenuhnya melalui Refleksi!

Tabel Metode Refleksi

Berikut adalah jadual ringkas bagi beberapa metode Refleksi biasa:

Metode Keterangan
Type.GetType() Dapatkan Type dengan nama yang ditentukan
Object.GetType() Dapatkan Type bagi contoh semasa
Type.GetMethods() Mengembalikan semua method awam bagi Type semasa
Type.GetProperties() Mengembalikan semua properti awam bagi Type semasa
Type.GetFields() Mengembalikan semua medan awam bagi Type semasa
Type.GetConstructors() Mengembalikan semua pengubah awam bagi Type semasa
Activator.CreateInstance() Cipta contoh jenis
MethodInfo.Invoke() Pemanggilan method
PropertyInfo.GetValue() Dapatkan nilai properti
PropertyInfo.SetValue() Set nilai properti

Kesimpulan

Wah! Kita telah meliputi banyak hal hari ini. Refleksi mungkin kelihatan seperti sesuatu yang membingungkan pada permulaan, tetapi ia adalah alat yang kuat dalam begalku C# anda. Ia membolehkan program anda untuk menjadi lebih fleksibel dan dinamik, menyesuaikan diri kepada syarat-syarat masa runtime.

Ingat, dengan kuasa yang besar datang tanggungjawab yang besar. Refleksi boleh lebih lambat daripada kode langsung dan boleh mengganggu keselamatan jenis jika tidak digunakan dengan hati-hati. Tetapi jika digunakan bijaksana, ia boleh menyelesaikan masalah yang sukar atau mustahil untuk diselesaikan sebaliknya.

Terus latih, terus jelajah, dan sebelum anda tahu, anda akan menjadi ahli refleksi! Selamat berkoding, bakal maestro C#!

Credits: Image by storyset