zoukankan      html  css  js  c++  java
  • 利用.net反射动态调用指定程序集的中的方法

    每个.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);
           调用返回的数据显示列表中。

  • 相关阅读:
    sp2010 升级sp2013 用户无法打开网站
    powerviot install in sharepoint 2013
    can not connect cube in performancce dashboard
    westrac server security configure user info
    添加报表服务在多服务器场
    sharepoint 2013 office web app 2013 文档在线浏览 IE11 浏览器不兼容解决方法
    delete job definition
    目前付款申请单内网打开慢的问题
    item style edit in sharepoint 2013
    Could not load file or assembly '$SharePoint.Project.AssemblyFullName$'
  • 原文地址:https://www.cnblogs.com/HondaHsu/p/734926.html
Copyright © 2011-2022 走看看