日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

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

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

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;
        }

    }

}


     項(xiàng)目2(DemoXml)中包含一個(gè)Test類,Test類中寫了一個(gè)getList方法,這個(gè)方法返回的數(shù)據(jù)是從數(shù)據(jù)庫讀取的。源代碼如下: 

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;
            }

        }

    }

}


     
項(xiàng)目3(WebDemo)中演示動(dòng)態(tài)用指定程序集中getList的方法返回一個(gè)DataTable,用一個(gè)gridview顯示其返回的數(shù)據(jù)。

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 數(shù)據(jù)初始化,可配置在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"= "加載自己定義數(shù)據(jù)";
        dr[
"filepath"= Server.MapPath(@"Files\Demo.dll");
        dt.Rows.Add(dr);
        dr 
= dt.NewRow();
        dr[
"name"= "加載xml數(shù)據(jù)";
        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";
            
//加載指定的程序集之內(nèi)存中
            Assembly assembly = Assembly.LoadFrom(strPath);
            
//返加程序集中的一個(gè)指定的對(duì)象,哪果是返回所有對(duì)象,則用GetTypes()返回一個(gè)Typt對(duì)象的數(shù)組.
            Type T = assembly.GetType(NameSpace);
            
//返回方法信息(公共方法)
            MethodInfo mi = T.GetMethod("getList");
            
//根據(jù)前面type類型創(chuàng)建一個(gè)對(duì)象
            object o = Activator.CreateInstance(T);
            
//參數(shù)
            object[] par = new object[] "E01" };
            
//通過MethodInfo對(duì)象的Invoke方法,動(dòng)態(tài)調(diào)用此方法,參數(shù)o是因?yàn)閷?shí)例方法需要在調(diào)用時(shí)有一個(gè)實(shí)例存在
            DataTable dt = (DataTable)mi.Invoke(o, par);
            
this.GridView1.DataSource = dt;
            
this.GridView1.DataBind();
        }

        
catch (Exception ex)
        
{
            
//do Exception
        }

    }

}


       通過Assembly.LoadFrom方法返回的Assembly對(duì)象,可以讀取其中的元數(shù)據(jù)。其中的GetType會(huì)返回一個(gè)用于表示指定程序集的type對(duì)象(讀取程序集中的所有類型用GetTypes會(huì)返回一個(gè)type對(duì)象的數(shù)組)。
       返回方法信息(公共方法)
       MethodInfo mi = T.GetMethod("getList");
       根據(jù)前面type類型創(chuàng)建一個(gè)對(duì)象
       object o = Activator.CreateInstance(T);
       參數(shù)
       object[] par = new object[] { "E01" };
       通過MethodInfo對(duì)象的Invoke方法,動(dòng)態(tài)調(diào)用此方法,參數(shù)o是因?yàn)閷?shí)例方法需要在調(diào)用時(shí)有一個(gè)實(shí)例存在.
       DataTable dt = (DataTable)mi.Invoke(o, par);
       調(diào)用返回的數(shù)據(jù)顯示列表中。
示例下載

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

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多