Setiap rakitan .net berisi metadata tambahan selain kode. Metadata mencakup informasi tentang rakitan itu sendiri, seperti nomor versi, rakitan mana yang direferensikan, dan semua jenis informasi, termasuk metode, properti, dan bidangnya. Dengan menggunakan refleksi .net, informasi ini dapat dibaca saat runtime dan metode dapat dipanggil secara dinamis.
Proyeknya hampir selesai, dan akhirnya saya punya waktu untuk menulis blog,
Buatlah contoh pemanggilan metode khusus perakitan secara dinamis.
Proyek 1 (Demo) berisi kelas Test, dan metode getList ditulis di kelas Test. Data yang dikembalikan oleh metode ini ditambahkan secara manual. Kode sumbernya adalah sebagai berikut:
Proyek 1
menggunakan Sistem;
menggunakan System.Collections.Generik;
menggunakan Sistem.Teks;
Demo namespace
Sistem.Data
{
Tes kelas publik
{
getList Tabel Data publik (id string)
{
DataTable dt = DataTable baru();
dt.Kolom.Tambahkan(Kolom Data baru("id"));
dt.Columns.Add(new DataColumn("nama"));
dt.Columns.Add(new DataColumn("seks"));
DataRow dr = dt.NewRow();
dr["id"] = "zl";
dr["nama"] = "Zhang Ling";
dr["jenis kelamin"] = "laki-laki";
dt.Baris.Tambahkan(dr);
dr = dt.BarisBaru();
dr["id"] = "zl";
dr["nama"] = "李思";
dr["jenis kelamin"] = "perempuan";
dt.Baris.Tambahkan(dr);
kembalikan dt;
}
}
}
Proyek 2 (DemoXml) berisi kelas Test. Metode getList ditulis di kelas Test. Data yang dikembalikan oleh metode ini dibaca dari database. Kode sumbernya adalah sebagai berikut:
Proyek 2
menggunakan Sistem;
menggunakan System.Collections.Generik;
menggunakan Sistem.Teks;
menggunakan Sistem.Data;
menggunakan Sistem.Data.SqlClient;
menggunakan Sistem.Xml;
namespace DemoXml
{
Tes kelas publik
{
cn SqlConnection pribadi;
getList Tabel Data publik (id string)
{
mencoba
{
cn = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["pubs"]);
SqlCommand cmd = baru SqlCommand();
SqlDataAdapter da = baru SqlDataAdapter();
cmd.CommandText = "PILIH au_id sebagai id,au_lname sebagai nama,au_fname sebagai jenis kelamin dari penulis";
cmd.CommandType = CommandType.Teks;
cmd.Koneksi = cn;
da.SelectCommand = cmd;
DataTable dt = DataTable baru();
da.Isi(dt);
kembalikan dt;
}
menangkap (Pengecualian ex)
{
throw new ApplicationException("Terjadi pengecualian: "+ex.Message+ex.StackTrace);
}
Akhirnya
{
cn.Tutup();
cn = nol;
}
}
}
}
Proyek 3 (WebDemo) mendemonstrasikan secara dinamis menggunakan metode getList pada rakitan yang ditentukan untuk mengembalikan DataTable, dan menggunakan tampilan kisi untuk menampilkan data yang dikembalikan.
Hubungi demo
menggunakan Sistem;
menggunakan Sistem.Data;
menggunakan Sistem.Konfigurasi;
menggunakan Sistem.Web;
menggunakan Sistem.Web.Keamanan;
menggunakan Sistem.Web.UI;
menggunakan Sistem.Web.UI.WebControls;
menggunakan System.Web.UI.WebControls.WebParts;
menggunakan Sistem.Web.UI.HtmlControls;
menggunakan System.Reflection;
kelas parsial publik _Default : System.Web.UI.Page
{
dilindungi kekosongan Page_Load (pengirim objek, EventArgs e)
{
jika (!IsPostBack)
{
DropBind();
}
}
Inisialisasi data, dapat dikonfigurasi di file web.config #region Inisialisasi data, dapat dikonfigurasi di file web.config
kekosongan publik DropBind()
{
DataTable dt = DataTable baru();
dt.Columns.Add(new DataColumn("nama"));
dt.Columns.Add(new DataColumn("jalur file"));
DataRow dr = dt.NewRow();
dr["nama"] = "Muat data Anda sendiri";
dr["jalur file"] = Server.MapPath(@"FileDemo.dll");
dt.Baris.Tambahkan(dr);
dr = dt.BarisBaru();
dr["nama"] = "Muat data xml";
dr["jalur file"] = Server.MapPath(@"FilesDemoXml.dll");
dt.Baris.Tambahkan(dr);
ini.DropDownList1.DataSource = dt;
this.DropDownList1.DataTextField = "nama";
this.DropDownList1.DataValueField = "jalur file";
ini.DropDownList1.DataBind();
}
#endregion
dilindungi kekosongan DropDownList1_SelectedIndexChanged(pengirim objek, EventArgs e)
{
mencoba
{
//Baca dan pilih file dll yang ditentukan
string strPath = (pengirim sebagai DropDownList).SelectedValue.Trim();
string NameSpace = ini.DropDownList1.SelectedIndex == 0 ?
//Muat rakitan yang ditentukan ke dalam memori
Majelis perakitan = Majelis.LoadFrom(strPath);
//Kembalikan objek tertentu di rakitan. Jika semua objek dikembalikan, gunakan GetTypes() untuk mengembalikan array objek Type.
Ketik T = perakitan.GetType(NameSpace);
//Informasi metode pengembalian (metode publik)
MethodInfo mi = T.GetMethod("getList");
//Membuat objek berdasarkan tipe sebelumnya
objek o = Aktivator.CreateInstance(T);
//parameter
objek[] par = objek baru[] { "E01" };
//Panggil metode ini secara dinamis melalui metode Invoke pada objek MethodInfo. Parameter o karena metode instance memerlukan sebuah instance untuk ada saat dipanggil.
DataTable dt = (DataTable)mi.Invoke(o, par);
ini.GridView1.DataSource = dt;
ini.GridView1.DataBind();
}
menangkap (Pengecualian ex)
{
//doException
}
}
}
Metadata pada objek Majelis yang dikembalikan oleh metode Majelis.LoadFrom dapat dibaca. GetType di antaranya akan mengembalikan objek tipe yang digunakan untuk mewakili rakitan yang ditentukan (membaca semua tipe di rakitan dan menggunakan GetTypes akan mengembalikan array objek tipe).
Informasi metode pengembalian (metode publik)
MethodInfo mi = T.GetMethod("getList");
Buat objek berdasarkan tipe sebelumnya
objek o = Aktivator.CreateInstance(T);
parameter
objek[] par = objek baru[] { "E01" };
Metode ini dipanggil secara dinamis melalui metode Invoke pada objek MethodInfo. Parameter o karena metode instance memerlukan sebuah instance untuk ada saat dipanggil.
DataTable dt = (DataTable)mi.Invoke(o, par);
Data yang dikembalikan oleh panggilan tersebut ditampilkan dalam daftar.
Contoh unduhan: