通过反射实现多数据访问
每种数据库都有自己的链接组件。比如:System.Data.SqlClient,System.Data.OracleClient,Oracle.DataAccess.Client,MySql.Data,IBM.Data.DB2,Sybase.Data.AseClient,iAnywhere.Data.AsaClient,Npgsql等等!
反射:
通过【Type类】可以访问任意数据类型信息,常使用Type类的静态方法GetType(),如Type t =Type.GetType("MySql.Data");这就拿到了组件(提前得先引用)的元数据。
(1)通过【Assembly类】加载程序集,例如:Assembly m_asmSqlClient = Assembly.LoadWithPartialName(“Oracle.DataAccess”);//LoadWithPartialName()使用部分名称从应用程序目录或从全局程序集缓存加载程序集。
(2)Type m_typSqlConnection = m_asmSqlClient.GetType("Oracle.DataAccess.Client.OracleConnection" ) //GetType()可以得到加载进来的程序集中的类
(3)ConstructorInfo info = m_typSqlConnection.GetConstructor(types); //GetConstructor(Type types )//根据参数类型得到实例,比如:Type[] types = new Type[1]; types[0] = Type.GetType("System.String"); 表示参数是字符串
(4)IDbConnection con = info.Invoke(parameters) as IDbConnection; //Invoke()初始化传入符合的参数类型,得到需要的类,参数:object[] parameters = new object[1]; parameters[0] = “链接字符串”;
//【Type类】
1.获取给定类型的Type引用有3种方式:
a.使用typeof运算符,如Type t = typeof(int);
b.使用GetType()方法,如int i;Type t = i.GetType();
c.使用Type类的静态方法GetType(),如Type t =Type.GetType("System.Double");
2.Type的属性:
Name:数据类型名;
FullName:数据类型的完全限定名,包括命名空间;
Namespace:数据类型的命名空间;
BaseType:直接基本类型;
UnderlyingSystemType:映射类型;
3.Type的方法:
GetMethod():返回一个方法的信息;
GetMethods():返回所有方法的信息。
//【Assembly】
System.Reflection.Assembly类是一个比较常用到的类,在反射中就经常用到。
Assembly是一个包含来程序的名称,版本号,自我描述,文件关联关系和文件位置等信息的一个集合。在.net框架中通过Assembly类来支持,该类位于System.Reflection下,物理位置位于:mscorlib.dll。
在Assembly有很多的方法和属性,里面的加载程序集有3个方法,分别是Load、LoadFrom和LoadFile。
//【ConstructorInfo 】
ConstructorInfo 类可以发现类构造函数的属性 (Attribute) 并提供对构造函数元数据的访问权。说白了通过它可以访问类的属性和方法。