电竞比分网-中国电竞赛事及体育赛事平台

分享

利用.net反射動態(tài)調用指定程序集的中的方法 - 系統(tǒng)架構與NET技術 - 博客園

 xnet 2007-01-08
    每個.net程序集除了代碼外都額外包含了元數據。元數據包括了程序集本身的信息,比如版本號,引用了什么程序集,所有類型的信息,包括其方法、屬性、字段。使用.net反射,可以在運行時讀取這些信息,并且可以動態(tài)地調用方法。
     項目快完了,終于有時間來寫blog了,,
     做一個動態(tài)調用程序集指定方法的例子。
     項目1(Demo)中包含一個Test類,Test類中寫了一個getList方法,這個方法返回的數據是手工加入的。源代碼如下:
     

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方法,這個方法返回的數據是從數據庫讀取的。源代碼如下: 

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("出現(xiàn)異常:"+ex.Message+ex.StackTrace);
            }

            
finally
            
{
                cn.Close();
                cn 
= null;
            }

        }

    }

}


     
項目3(WebDemo)中演示動態(tài)用指定程序集中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();
        }

    }

    
#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類型創(chuàng)建一個對象
            object o = Activator.CreateInstance(T);
            
//參數
            object[] par = new object[] "E01" };
            
//通過MethodInfo對象的Invoke方法,動態(tài)調用此方法,參數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類型創(chuàng)建一個對象
       object o = Activator.CreateInstance(T);
       參數
       object[] par = new object[] { "E01" };
       通過MethodInfo對象的Invoke方法,動態(tài)調用此方法,參數o是因為實例方法需要在調用時有一個實例存在.
       DataTable dt = (DataTable)mi.Invoke(o, par);
       調用返回的數據顯示列表中。
示例下載

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多