|
Posted on
2007-07-03 15:40
徐正柱-
阅读( 239)
评论()
编辑
收藏
举报
- 每个.net程序集除了代码外都额外包含了元数据。元数据包括了程序集本身的信息,比如版本号,引用了什么程序集,所有类型的信息,包括其方法、属性、字段。使用.net反射,可以在运行时读取这些信息,并且可以动态地调用方法。
项目快完了,终于有时间来写blog了,, 做一个动态调用程序集指定方法的例子。 项目1(Demo)中包含一个Test类,Test类中写了一个getList方法,这个方法返回的数据是手工加入的。源代码如下: 项目1 using System; using System.Collections.Generic; using System.Text; using System.Data;
- namespace Demo
{ public class Test { public DataTable getList(string id) { 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); return dt; } } }
-
- 项目2(DemoXml)中包含一个Test类,Test类中写了一个getList方法,这个方法返回的数据是从数据库读取的。源代码如下:
项目2 using System; using System.Collections.Generic; using System.Text; using System.Data; using System.Data.SqlClient; using System.Xml; namespace DemoXml { public class Test { private SqlConnection cn; public DataTable getList(string id) { try { cn = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["pubs"]); SqlCommand cmd = new SqlCommand(); SqlDataAdapter da = new SqlDataAdapter(); cmd.CommandText = "SELECT au_id as id,au_lname as name,au_fname as sex from authors"; cmd.CommandType = CommandType.Text; cmd.Connection = cn; da.SelectCommand = cmd; DataTable dt = new DataTable(); da.Fill(dt); return dt; } catch (Exception ex) { throw new ApplicationException("出现异常:"+ex.Message+ex.StackTrace); } finally { cn.Close(); cn = null; } } } }
-
- 项目3(WebDemo)中演示动态用指定程序集中getList的方法返回一个DataTable,用一个gridview显示其返回的数据。
调用演示 using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Reflection;
- public partial class _Default : System.Web.UI.Page
{ protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { DropBind(); } } 数据初始化,可配置在web.config文件中#region 数据初始化,可配置在web.config文件中 public void 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(@"Files\Demo.dll"); dt.Rows.Add(dr); dr = dt.NewRow(); dr["name"] = "加载xml数据"; dr["filepath"] = Server.MapPath(@"Files\DemoXml.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)
{ try { //读取选择指定的dll文件 string strPath = (sender as DropDownList).SelectedValue.Trim(); string NameSpace = this.DropDownList1.SelectedIndex == 0 ? "Demo.Test" : "DemoXml.Test"; //加载指定的程序集之内存中 Assembly assembly = Assembly.LoadFrom(strPath); //返加程序集中的一个指定的对象,哪果是返回所有对象,则用GetTypes()返回一个Typt对象的数组. Type T = assembly.GetType(NameSpace); //返回方法信息(公共方法) MethodInfo mi = T.GetMethod("getList"); //根据前面type类型创建一个对象 object o = Activator.CreateInstance(T); //参数 object[] par = new object[] { "E01" }; //通过MethodInfo对象的Invoke方法,动态调用此方法,参数o是因为实例方法需要在调用时有一个实例存在 DataTable dt = (DataTable)mi.Invoke(o, par); this.GridView1.DataSource = dt; this.GridView1.DataBind(); } catch (Exception ex) { //do Exception } } }
-
- 通过Assembly.LoadFrom方法返回的Assembly对象,可以读取其中的元数据。其中的GetType会返回一个用于表示指定程序集的type对象(读取程序集中的所有类型用GetTypes会返回一个type对象的数组)。
返回方法信息(公共方法) MethodInfo mi = T.GetMethod("getList"); 根据前面type类型创建一个对象 object o = Activator.CreateInstance(T); 参数 object[] par = new object[] { "E01" }; 通过MethodInfo对象的Invoke方法,动态调用此方法,参数o是因为实例方法需要在调用时有一个实例存在. DataTable dt = (DataTable)mi.Invoke(o, par); 调用返回的数据显示列表中。
|