[转载]使用反射技术动态创建类对象(实例代码)

经过数天的研究,终于能动态加载数据访问层了。虽然网上有不少介绍反射的文章,但都是从理论上来说的,没有一个特别详细的例子,所以一直没能写出实际代码。这里把自己的一段代码写出来,希望能够帮助像我一样的初学者快速上手,先应用,再深入,免得着急。

首先说一下基本信息,本例以对数据库中的一个表Sort(类别)的访问为基础。表结构就不说了,而且我也不想涉及到对数据库的具体操作,主要是看一下思路。关于反射的一些概念和基本常识,请参考相关文章,网上有写得非常好的,作者就不班门弄斧了。

首先创建几个存放类文件的目录:    

    IDAL,表示数据访问层接口;

    SQLServerDAL,表示数据访问层,用于操作SQL Server数据库;

    AccessDAL,表示数据访问层,用于操作Access数据库;

    DALFactory,表示数据访问层类的类工厂;

    BLL,表示业务逻辑层;

然后在各文件夹下建立类,下面是对应的类的代码,命名空间为 “KoalaStudio.BookshopPortal”,这里只保留了最必要的代码。

(1)首先建立一个数据访问层接口KoalaStudio.BookshopPortal.IDAL.ISort:

    using System;

    using System.Data; 

    namespace KoalaStudio.BookshopPortal.IDAL 

     { 

        interface ISort 

        { 

            DataSet GetList();  

        }

    }

说明:首先定义了一个数据访问层接口,所有的数据访问层类都必须派生于该接口,这样就能对业务逻辑层提供统一的调用方法。

(2)然后建立数据访问层类KoalaStudio.BookshopPortal.SQLServerDAL.Sort和KoalaStudio.BookshopPortal.AccessDAL.Sort

    using System;

    using System.Data;

    using KoalaStudio.BookshopPortal.IDAL; 

    

    namespace KoalaStudio.BookshopPortal.SQLServerDAL 

     {

        class Sort : ISort {        

            // 得到类别信息列表 

             public DataSet GetList()

            { 

                //此处为SQL数据库访问代码,得到的结果作为一个数据集返回

            }

        }

    } 

    namespace KoalaStudio.BookshopPortal.AccessDAL

    { 

        class Sort : ISort 

        { 

             // 得到类别信息列表 

            public DataSet GetList() 

           { 

               //此处为Access数据库访问代码,得到的结果作为一个数据集返回             }

        }

    }

说明:两个类都派生于ISort,实现的功能相同,不同点就是所操作的数据库不同

(3)下面就是类工厂的实现

    using System;

    using System.Reflection;

    using KoalaStudio.BookshopPortal.IDAL; 

    namespace KoalaStudio.BookshopPortal.DALFactory

     {

        class Sort 

       {

            public static KoalaStudio.BookshopPortal.IDAL.ISort Create() 

           { 

               //后台使用SQL Server数据库

                 string className = "KoalaStudio.BookshopPortal.SQLServerDAL.Sort";

                 //如果后台使用Access数据库,则写成:

               //string className = "KoalaStudio.BookshopPortal.AccessDAL.Sort";

                 Type t = Type.GetType(className); 

                 return (ISort) Activator.CreateInstance(t);       

            } 

        }

    }

说明:首先得到一个字符串,这个字符串就是需要使用的数据访问层类的名称。再实际环境中,需要把这个字符串存储于配置文件中,这样在程序运行时,只要修改了字符串也就修改了程序操作数据库的代码,而不用重新编译。

“Type t = Type.GetType(className);”根据字符串提供的类名称返回这个类的类型信息,然后用“Activator.CreateInstance(t)”即可将此类实例化。最后用“(ISort)”将得到的实例转换为“KoalaStudio.BookshopPortal.IDAL.ISort”类型。

(4)最后是KoalaStudio.BookshopPortal.BLL.Sor类

    using System;

    using System.Data;

    using KoalaStudio.BookshopPortal.IDAL; 

    

    namespace KoalaStudio.BookshopPortal.BLL

    { 

        public class Sort 

        { 

             /// 返回类别名称列表

             public static DataSet GetNameList()

            {

                 ISort sortDal = DALFactory.Sort.Create();

                 return sortDal.GetMainList();

            }

        }

    }

说明:用“ISort sortDal = DALFactory.Sort.Create();”既可直接生成一个数据访问类的实例。在这里,我们不必理会后台是什么数据库,只需要直接使用类工厂给我们提供的数据访问类实例即可。

时间: 2024-08-01 19:03:57

[转载]使用反射技术动态创建类对象(实例代码)的相关文章

net 反射 c#-我就想知道“动态创建类的实例”中的动态到底什么意思?

问题描述 我就想知道"动态创建类的实例"中的动态到底什么意思? 讲反射的地方到处都在讲一句话:动态创建类的实例,我就想知道这个"动态"到底是什么意思?怎么就叫"动态"了?

用.net动态创建类的实例

用.net动态创建类的实例 看了网上很多关于DotNet动态创建类的实例的文章,我这里想总结一下,其实方法很简单,就是用"Activator.CreateInstance".但是这个方法需要待创建的类的Type作为参数,为了获得该参数,可以利用[Assembly].GetType方法,这个方法只需要待创建的类的名称(名称字符串)就可以了,最后的问题就是要获得这个类所在的程序集.如何获得待创建的类所在程序集,那么就解决了这个问题. 其实,在获得程序集这个问题上,可以有更简单的办法,以下是

经典教程:用.net动态创建类的实例

看了网上很多关于DotNet动态创建类的实例的文章,我这里想总结一下,其实方法很简单,就是用"Activator.CreateInstance".但是这个方法需要待创建的类的Type作为参数,为了获得该参数,可以利用[Assembly].GetType方法,这个方法只需要待创建的类的名称(名称字符串)就可以了,最后的问题就是要获得这个类所在的程序集.如何获得待创建的类所在程序集,那么就解决了这个问题. 大家可以参考http://www.cnblogs.com/ShadowK/archi

应用技巧:用.net动态创建类的实例

创建|动态|技巧 看了网上很多关于DotNet动态创建类的实例的文章,我这里想总结一下,其实方法很简单,就是用"Activator.CreateInstance".但是这个方法需要待创建的类的Type作为参数,为了获得该参数,可以利用[Assembly].GetType方法,这个方法只需要待创建的类的名称(名称字符串)就可以了,最后的问题就是要获得这个类所在的程序集.如何获得待创建的类所在程序集,那么就解决了这个问题. 大家可以参考http://www.cnblogs.com/Shad

动态创建类实例代码_python

例如: import mymodule myobject = mymodule.myclass() 或者 from mymodule import myclass myobject = myclass() 如果要在程序中动态地创建类实例,也一样要分两步走,例如: m = __import__('mymodule') c = getattr(m, 'myclass') myobject = c() 但是要注意:如果myclass并不在mymodule的自动导出列表中(__all__),则必须显式地

C# 反射 通过类名创建类实例

"反射"其实就是利用程序集的元数据信息. 反射可以有很多方法,编写程序时请先导入 System.Reflection 命名空间. 1.假设你要反射一个 DLL 中的类,并且没有引用它(即未知的类型): Assembly assembly = Assembly.LoadFile("程序集路径,不能是相对路径"); // 加载程序集(EXE 或 DLL) object obj = assembly.CreateInstance("类的完全限定名(即包括命名空间

JS,Jquery及ExtJs不同脚本动态创建DOM对象

本文介绍简单使用JavaScript.JQuery.ExtJs进行DOM对象创建的测试,主要是使用JavaScript.JQuery.ExtJs动态创建Table对象.动态Table数据填充.多选控制. 1.简单前台数据处理 界面有点丑了,没美化界面,主要是JavaScript动态创建Table.效果图: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/T

JavaScript创建类/对象的几种方式概述及实例_javascript技巧

在JS中,创建对象(Create Object)并不完全是我们时常说的创建类对象,JS中的对象强调的是一种复合类型,JS中创建对象及对对象的访问是极其灵活的. JS对象是一种复合类型,它允许你通过变量名存储和访问,换一种思路,对象是一个无序的属性集合,集合中的每一项都由名称和值组成(听起来是不是很像我们常听说的HASH表.字典.健/值对?),而其中的值类型可能是内置类型(如number,string),也可能是对象. 一.由一对大括号括起来 复制代码 代码如下: var emptyObj = {

JavaScript中创建类/对象的几种方法总结_javascript技巧

在JS中,创建对象(Create Object)并不完全是我们时常说的创建类对象,JS中的对象强调的是一种复合类型,JS中创建对象及对对象的访问是极其灵活的. JS对象是一种复合类型,它允许你通过变量名存储和访问,换一种思路,对象是一个无序的属性集合,集合中的每一项都由名称和值组成(听起来是不是很像我们常听说的HASH表.字典.健/值对?),而其中的值类型可能是内置类型(如number,string),也可能是对象. 一.由一对大括号括起来 复制代码 代码如下: var emptyObj = {