利用反射创建类实例的两种方法
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页面
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();
}
}
}
1
using System;
2
using System.Collections;
3
using System.ComponentModel;
4
using System.Data;
5
using System.Text;
6
using System.Drawing;
7
using System.Web;
8
using System.Web.SessionState;
9
using System.Web.UI;
10
using System.Web.UI.WebControls;
11
using System.Web.UI.HtmlControls;
12![](/Images/OutliningIndicators/None.gif)
13
namespace 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![](/Images/OutliningIndicators/InBlock.gif)
30
Web 窗体设计器生成的代码
50
}
51
}
52![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/None.gif)
5
![](/Images/OutliningIndicators/None.gif)
6
![](/Images/OutliningIndicators/None.gif)
7
![](/Images/OutliningIndicators/None.gif)
8
![](/Images/OutliningIndicators/None.gif)
9
![](/Images/OutliningIndicators/None.gif)
10
![](/Images/OutliningIndicators/None.gif)
11
![](/Images/OutliningIndicators/None.gif)
12
![](/Images/OutliningIndicators/None.gif)
13
![](/Images/OutliningIndicators/None.gif)
14
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
15
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
16
![](/Images/OutliningIndicators/InBlock.gif)
17
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
18
![](/Images/OutliningIndicators/InBlock.gif)
19
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
20
![](/Images/OutliningIndicators/InBlock.gif)
21
![](/Images/OutliningIndicators/InBlock.gif)
22
![](/Images/OutliningIndicators/InBlock.gif)
23
![](/Images/OutliningIndicators/InBlock.gif)
24
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
25
![](/Images/OutliningIndicators/InBlock.gif)
26
![](/Images/OutliningIndicators/InBlock.gif)
27
![](/Images/OutliningIndicators/InBlock.gif)
28
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
29
![](/Images/OutliningIndicators/InBlock.gif)
30
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
50
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
51
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
52
![](/Images/OutliningIndicators/None.gif)
运用Type.GetType与Activator.CreateInstance把testtest.dll程序集中对应的testtest.GuestBookSqlDataProvider类实例化,实例化后类似GuestBookDataProvider.CreateInstance().GetAllCars()的调用其实就是直接操作testtest.dll程序集中testtest.GuestBookSqlDataProvider类下的
好像饶了一大圈,用起来很麻烦,不知道这样有什么好处,我是看.text blog和Community Server里都这样用,就是设计模式里的东西。