Junstyle

    学习中...
利用反射创建类实例的两种方法
using System;
using System.Reflection;
using System.Data;

namespace testtest
{
    
/// <summary>
    
/// GuestBookDataProvider 的摘要说明。
    
/// 用到了设计模式的单例模式
    
/// </summary>
    public abstract class GuestBookDataProvider
    {
        
static GuestBookDataProvider(){ }

        
/// <summary>
        
/// 方法1利用构造函数元数据
        
/// </summary>
        
/// <returns></returns>
        public static GuestBookDataProvider CreateInstance1()
        {
            ConstructorInfo gbDataProvider 
= null;
            
//用GetType取对象类型,参数前面是类名,包括名称空间,后面是程序集名称
            Type type = Type.GetType("testtest.GuestBookSqlDataProvider,testtest");
            
//构造函数传递的参数类型数组,我这里构造函数没有参数,所以是Type.EmptyTypes,Invoke里也传的是null
//            Type[] params = new Type[2];
//            params[0] = typeof(string);
//            params[1] = typeof(string);
            gbDataProvider = type.GetConstructor(Type.EmptyTypes);//type.GetConstructor(params)
            
//我这里构造函数没有参数,所以Invoke里也传的是null
            return (GuestBookDataProvider)gbDataProvider.Invoke(null);//(GuestBookDataProvider)gbDataProvider.Invoke(new object[2]("string1","string2")
        }

        
/// <summary>
        
/// 方法2利用System.Activator.CreateInstance方法直接创建
        
/// </summary>
        
/// <returns></returns>
        public static GuestBookDataProvider CreateInstance2()
        {
            Type type 
= Type.GetType("testtest.GuestBookSqlDataProvider,testtest");
            
//我这里构造函数没有参数,所以Invoke里只传对象的类型;有参数的话直接传递参数值就行了
            object newObject = Activator.CreateInstance(type);//Activator.CreateInstance(type,new object[2]("string1","string2"));
            return (GuestBookDataProvider)newObject;
        }
    
        
public abstract IDataReader GetAllCars();
    }

    
public class GuestBookSqlDataProvider : GuestBookDataProvider
    {
        
public override IDataReader GetAllCars()
        {
            DataProviders db
=new DataProviders();
            IDataReader dr
=db.GetDataReader("select * from Cars");
            db.Close();
            
return dr;
        }

    }

    
public class DataProviders : AchelyLib.Data.SQLDB
    {
        
public DataProviders()
        {
            
base.DbType = AchelyLib.Data.SQLDatabaseType.dbADO;
            
base.ConnectionString = "server=junstyle;uid=sa;pwd=junstyle;database=fcsiter";
            
base.Open();
        }
    }
}
调用的Asp.net页面
 1using System;
 2using System.Collections;
 3using System.ComponentModel;
 4using System.Data;
 5using System.Text;
 6using System.Drawing;
 7using System.Web;
 8using System.Web.SessionState;
 9using System.Web.UI;
10using System.Web.UI.WebControls;
11using System.Web.UI.HtmlControls;
12
13namespace testtest
14{
15    /// <summary>
16    /// App1 的摘要说明。
17    /// </summary>

18    public class App1 : System.Web.UI.Page
19    {
20        protected System.Web.UI.WebControls.DataGrid DataGrid1;
21        //public StringBuilder s=null;
22    
23        private void Page_Load(object sender, System.EventArgs e)
24        {
25            //DataGrid1.DataSource = GuestBookDataProvider.CreateInstance1().GetAllCars();
26            DataGrid1.DataSource = GuestBookDataProvider.CreateInstance2().GetAllCars();
27            DataGrid1.DataBind(); 
28        }

29
30        Web 窗体设计器生成的代码
50    }

51}

52

运用Type.GetTypeActivator.CreateInstancetesttest.dll程序集中对应的testtest.GuestBookSqlDataProvider类实例化,实例化后类似GuestBookDataProvider.CreateInstance().GetAllCars()的调用其实就是直接操作testtest.dll程序集中testtest.GuestBookSqlDataProvider类下的 public override IDataReader GetAllCars()方法。
好像饶了一大圈,用起来很麻烦,不知道这样有什么好处,我是看.text blog和Community Server里都这样用,就是设计模式里的东西。

posted on 2005-10-20 03:25  Junstyle  阅读(927)  评论(1编辑  收藏  举报