يحتوي كل تجميع .net على بيانات تعريف إضافية بالإضافة إلى التعليمات البرمجية. تتضمن بيانات التعريف معلومات حول التجميع نفسه، مثل رقم الإصدار والتجميع الذي تتم الإشارة إليه وجميع أنواع المعلومات، بما في ذلك أساليبه وخصائصه وحقوله. باستخدام انعكاس .net، يمكن قراءة هذه المعلومات في وقت التشغيل ويمكن استدعاء الأساليب ديناميكيًا.
لقد انتهى المشروع تقريبًا، وأخيرًا أصبح لدي الوقت لكتابة مدونة،
قم بعمل مثال على استدعاء أسلوب خاص بالتجميع ديناميكيًا.
يحتوي المشروع 1 (التجريبي) على فئة اختبار، ويتم كتابة طريقة getList في فئة الاختبار، وتتم إضافة البيانات التي يتم إرجاعها بواسطة هذه الطريقة يدويًا. كود المصدر هو كما يلي:
المشروع 1
باستخدام النظام؛
باستخدام System.Collections.Generic؛
باستخدام System.Text؛
باستخدام System.Data
التجريبي
{
اختبار الطبقة العامة
{
getList DataTable العامة (معرف السلسلة)
{
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("id"));
dt.Columns.Add(new DataColumn("name"));
dt.Columns.Add(new DataColumn("sex"));
DataRow dr = dt.NewRow();
dr["id"] = "zl";
dr["name"] = "تشانغ لينغ";
dr["sex"] = "ذكر";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["id"] = "zl";
dr["name"] = "الاسم";
dr["sex"] = "أنثى";
dt.Rows.Add(dr);
العودة د.ت.
}
}
}
يحتوي المشروع 2 (DemoXml) على فئة اختبار. تتم كتابة أسلوب getList في فئة الاختبار. تتم قراءة البيانات التي يتم إرجاعها بواسطة هذه الطريقة من قاعدة البيانات. كود المصدر هو كما يلي:
المشروع 2
باستخدام النظام؛
باستخدام System.Collections.Generic؛
باستخدام System.Text؛
باستخدام System.Data؛
باستخدام System.Data.SqlClient؛
باستخدام System.Xml؛
مساحة الاسم DemoXml
{
اختبار الطبقة العامة
{
SqlConnection الخاص cn؛
getList DataTable العامة (معرف السلسلة)
{
يحاول
{
cn = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["pubs"]);
SqlCommand cmd = new SqlCommand();
SqlDataAdapter da = new SqlDataAdapter();
cmd.CommandText = "حدد au_id كمعرف،au_lname كاسم،au_fname كجنس من المؤلفين";
cmd.CommandType = CommandType.Text;
cmd.Connection = cn;
da.SelectCommand = cmd;
DataTable dt = new DataTable();
da.Fill(dt);
العودة د.ت.
}
قبض (استثناء على سبيل المثال)
{
طرح ApplicationException جديد("حدث استثناء:"+ex.Message+ex.StackTrace);
}
أخيراً
{
cn.Close();
cn = فارغ;
}
}
}
}
يوضح المشروع 3 (WebDemo) استخدام أسلوب getList في التجميع المحدد ديناميكيًا لإرجاع DataTable، واستخدام طريقة عرض الشبكة لعرض البيانات التي تم إرجاعها.
اتصل بالعرض التوضيحي
باستخدام النظام؛
باستخدام System.Data؛
باستخدام System.Configuration؛
باستخدام 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 = new DataTable();
dt.Columns.Add(new DataColumn("name"));
dt.Columns.Add(new DataColumn("filepath"));
DataRow dr = dt.NewRow();
dr["name"] = "قم بتحميل بياناتك";
dr["filepath"] = Server.MapPath(@"FilesDemo.dll");
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["name"] = "تحميل بيانات xml";
dr["filepath"] = Server.MapPath(@"FilesDemoXml.dll");
dt.Rows.Add(dr);
this.DropDownList1.DataSource = dt;
this.DropDownList1.DataTextField = "name";
this.DropDownList1.DataValueField = "filepath";
this.DropDownList1.DataBind();
}
#endregion
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
يحاول
{
// اقرأ وحدد ملف dll المحدد
سلسلة strPath = (المرسل كـ DropDownList).SelectedValue.Trim();
سلسلة 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);
// المعلمة
object[] par = new object[] { "E01" };
// استدعاء هذه الطريقة ديناميكيًا من خلال طريقة الاستدعاء لكائن MethodInfo المعلمة o لأن طريقة المثيل تتطلب وجود مثيل عند الاتصال.
DataTable dt = (DataTable)mi.Invoc(o, par);
this.GridView1.DataSource = dt;
this.GridView1.DataBind();
}
قبض (استثناء على سبيل المثال)
{
//doException
}
}
}
يمكن قراءة بيانات التعريف الموجودة في كائن التجميع الذي تم إرجاعه بواسطة أسلوب Assembly.LoadFrom. سيقوم GetType من بينها بإرجاع كائن كتابة يستخدم لتمثيل التجميع المحدد (قراءة جميع الأنواع في التجميع واستخدام GetTypes ستؤدي إلى إرجاع مصفوفة من كائنات الكتابة).
معلومات طريقة الإرجاع (الطريقة العامة)
MethodInfo mi = T.GetMethod("getList");
قم بإنشاء كائن بناءً على النوع السابق
الكائن o = Activator.CreateInstance(T);
المعلمة
object[] par = new object[] { "E01" };
يتم استدعاء هذه الطريقة ديناميكيًا من خلال طريقة الاستدعاء لكائن MethodInfo. المعلمة o لأن أسلوب المثيل يتطلب وجود مثيل عند استدعائه.
DataTable dt = (DataTable)mi.Invoc(o, par);
يتم عرض البيانات التي تم إرجاعها بواسطة المكالمة في القائمة.
تنزيل العينة: