利用.net反射动态调用指定程序集的中的方法
点击次数:16 次 发布日期:2008-11-26 11:33:57 作者:源代码网
|
源代码网推荐 项目快完了,终于有时间来写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(@"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) 源代码网推荐 { 源代码网推荐 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); 源代码网推荐 调用返回的数据显示列表中。 源代码网推荐 示例下载:http://www.cnblogs.com/Files/NetFans/Solution2.rar 源代码网推荐 源代码网推荐 做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。 源代码网推荐 源代码网供稿. |
