แอสเซมบลี .net ทุกรายการมีข้อมูลเมตาเพิ่มเติมนอกเหนือจากโค้ด ข้อมูลเมตาประกอบด้วยข้อมูลเกี่ยวกับแอสเซมบลีเอง เช่น หมายเลขเวอร์ชัน แอสเซมบลีที่ถูกอ้างอิง และข้อมูลทุกประเภท รวมถึงวิธีการ คุณสมบัติ และฟิลด์ การใช้การสะท้อนกลับของ .net ข้อมูลนี้สามารถอ่านได้ขณะรันไทม์และสามารถเรียกใช้เมธอดแบบไดนามิกได้
โปรเจ็กต์ใกล้จะเสร็จแล้ว และในที่สุดฉันก็มีเวลาเขียนบล็อก
สร้างตัวอย่างการเรียกเมธอดเฉพาะแอสเซมบลีแบบไดนามิก
โครงการ 1 (สาธิต) มีคลาสทดสอบ และเมธอด getList ถูกเขียนในคลาสทดสอบ ข้อมูลที่ส่งคืนโดยวิธีนี้จะถูกเพิ่มด้วยตนเอง ซอร์สโค้ดมีดังนี้:
โครงการที่ 1
ใช้ระบบ;
ใช้ System.Collections.Generic;
ใช้ System.Text;
ใช้ System.Data
การสาธิตเนมสเปซ
-
การทดสอบในชั้นเรียนสาธารณะ
-
DataTable getList สาธารณะ (รหัสสตริง)
-
DataTable dt = DataTable ใหม่ ();
dt.Columns.Add(ข้อมูลคอลัมน์ใหม่("id"));
dt.Columns.Add(ข้อมูลคอลัมน์ใหม่("ชื่อ"));
dt.Columns.Add(new DataColumn("เพศ"));
DataRow dr = dt.NewRow();
ดร.["id"] = "zl";
dr["name"] = "จางหลิง";
ดร.["เพศ"] = "ชาย";
dt.Rows.Add(ดร.);
ดร. = dt.NewRow();
ดร.["id"] = "zl";
dr["name"] = "李思";
ดร.["เพศ"] = "เพศหญิง";
dt.Rows.Add(ดร.);
กลับ dt;
-
-
}
โครงการ 2 (DemoXml) มีคลาสการทดสอบ วิธีการ getList ถูกเขียนในคลาสการทดสอบ ข้อมูลที่ส่งคืนโดยวิธีนี้จะถูกอ่านจากฐานข้อมูล ซอร์สโค้ดมีดังนี้:
โครงการ 2
ใช้ระบบ;
ใช้ System.Collections.Generic;
ใช้ System.Text;
ใช้ System.Data;
โดยใช้ System.Data.SqlClient;
ใช้ System.Xml;
เนมสเปซ DemoXml
-
การทดสอบในชั้นเรียนสาธารณะ
-
SqlConnection ส่วนตัว cn;
DataTable getList สาธารณะ (รหัสสตริง)
-
พยายาม
-
cn = SqlConnection ใหม่ (System.Configuration.ConfigurationSettings.AppSettings ["pubs"]);
SqlCommand cmd = SqlCommand ใหม่();
SqlDataAdapter da = SqlDataAdapter(); ใหม่
cmd.CommandText = "SELECT au_id as id,au_lname as name,au_fname as sex from author";
cmd.CommandType = CommandType.Text;
cmd.Connection = cn;
da.SelectCommand = cmd;
DataTable dt = DataTable ใหม่ ();
da.เติม(dt);
กลับ dt;
-
catch (ข้อยกเว้น เช่น)
-
โยน ApplicationException ใหม่ ("เกิดข้อยกเว้น: "+ex.Message+ex.StackTrace);
-
ในที่สุด
-
cn.ปิด();
CN = โมฆะ;
-
-
-
}
โครงการ 3 (WebDemo) สาธิตแบบไดนามิกโดยใช้วิธี getList ในแอสเซมบลีที่ระบุเพื่อส่งคืน DataTable และใช้ gridview เพื่อแสดงข้อมูลที่ส่งคืน
โทรสาธิต
ใช้ระบบ;
ใช้ System.Data;
โดยใช้ระบบการกำหนดค่า;
ใช้ System.Web;
โดยใช้ System.Web.Security;
โดยใช้ System.Web.UI;
ใช้ System.Web.UI.WebControls;
ใช้ System.Web.UI.WebControls.WebParts;
ใช้ System.Web.UI.HtmlControls;
ใช้ System.Reflection
คลาสสาธารณะบางส่วน _Default : System.Web.UI.Page
-
โมฆะที่ได้รับการป้องกัน Page_Load (ผู้ส่งวัตถุ EventArgs e)
-
ถ้า (!IsPostBack)
-
DropBind();
-
-
การเริ่มต้นข้อมูลสามารถกำหนดค่าได้ในไฟล์ web.config #region การเริ่มต้นข้อมูลสามารถกำหนดค่าได้ในไฟล์ web.config
โมฆะสาธารณะ DropBind()
-
DataTable dt = DataTable ใหม่ ();
dt.Columns.Add(ข้อมูลคอลัมน์ใหม่("ชื่อ"));
dt.Columns.Add(new DataColumn("filepath"));
DataRow dr = dt.NewRow();
dr["name"] = "โหลดข้อมูลของคุณเอง";
dr["filepath"] = Server.MapPath(@"FilesDemo.dll");
dt.Rows.Add(ดร.);
ดร. = dt.NewRow();
dr["name"] = "โหลดข้อมูล xml";
dr["filepath"] = Server.MapPath(@"FilesDemoXml.dll");
dt.Rows.Add(ดร.);
this.DropDownList1.DataSource = dt;
this.DropDownList1.DataTextField = "ชื่อ";
this.DropDownList1.DataValueField = "เส้นทางไฟล์";
this.DropDownList1.DataBind();
-
#endregion
ป้องกันเป็นโมฆะ DropDownList1_SelectedIndexChanged (ผู้ส่งวัตถุ EventArgs e)
-
พยายาม
-
//อ่านและเลือกไฟล์ dll ที่ระบุ
string strPath = (ผู้ส่งเป็น DropDownList).SelectedValue.Trim();
string NameSpace = this.DropDownList1.SelectedIndex == 0 ? "Demo.Test" : "DemoXml.Test";
//โหลดชุดประกอบที่ระบุลงในหน่วยความจำ
ชุดประกอบ = Assembly.LoadFrom(strPath);
//ส่งคืนวัตถุที่ระบุในแอสเซมบลี หากวัตถุทั้งหมดถูกส่งคืน ให้ใช้ GetTypes() เพื่อส่งคืนอาร์เรย์ของวัตถุประเภท
พิมพ์ T = assembly.GetType (NameSpace);
//ข้อมูลวิธีการส่งคืน (วิธีสาธารณะ)
MethodInfo mi = T.GetMethod("getList");
//สร้างวัตถุตามประเภทก่อนหน้า
วัตถุ o = Activator.CreateInstance(T);
//พารามิเตอร์
วัตถุ [] พาร์ = วัตถุใหม่ [] { "E01" };
//เรียกเมธอดนี้แบบไดนามิกผ่านเมธอด Invoid ของอ็อบเจ็กต์ MethodInfo พารามิเตอร์ o เป็นเพราะเมธอดอินสแตนซ์จำเป็นต้องมีอินสแตนซ์อยู่เมื่อถูกเรียก
DataTable dt = (DataTable) mi.Inrigg (o, พาร์);
นี้.GridView1.DataSource = dt;
นี้.GridView1.DataBind();
-
catch (ข้อยกเว้น เช่น)
-
//ทำข้อยกเว้น
-
-
}
ข้อมูลเมตาในวัตถุ Assembly ที่ส่งคืนโดยเมธอด Assembly.LoadFrom สามารถอ่านได้ GetType ในหมู่พวกเขาจะส่งคืนวัตถุประเภทที่ใช้เพื่อแสดงแอสเซมบลีที่ระบุ (การอ่านทุกประเภทในแอสเซมบลีและการใช้ GetTypes จะส่งคืนอาร์เรย์ของวัตถุประเภท)
ข้อมูลวิธีการส่งคืน (วิธีสาธารณะ)
MethodInfo mi = T.GetMethod("getList");
สร้างวัตถุตามประเภทก่อนหน้า
วัตถุ o = Activator.CreateInstance(T);
พารามิเตอร์
วัตถุ [] พาร์ = วัตถุใหม่ [] { "E01" };
วิธีการนี้ถูกเรียกแบบไดนามิกผ่านวิธีการเรียกใช้ของออบเจ็กต์ MethodInfo พารามิเตอร์ o เป็นเพราะวิธีการอินสแตนซ์ต้องมีอินสแตนซ์อยู่เมื่อถูกเรียก
DataTable dt = (DataTable) mi.Inrigg (o, พาร์);
ข้อมูลที่ส่งคืนโดยการโทรจะแสดงในรายการ
ดาวน์โหลดตัวอย่าง: