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


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

    首先说一下基本信息,本例以对数据库中的一个表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();”既可直接生成一个数据访问类的实例。在这里,我们不必理会后台是什么数据库,只需要直接使用类工厂给我们提供的数据访问类实例即可。

    作者:菩提树下的杨过
    出处:http://yjmyzz.cnblogs.com
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    Python与常见加密方式
    ERROR 2002 (HY000):Can't connect to local MySQL server though socket '/var/lib/mysql/mysql.sock'(2)
    hive的分区表
    内部表和外部表的区别
    hive之SQL
    执行wc的时候提示连接被拒绝。Connection refused
    hive的简介
    hive的部署
    top命令信息
    web界面解读
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/1027808.html
Copyright © 2020-2023  润新知