ASP.NET通过反射获取泛型列表,从而节省代码量

在某些情况下,要返回某个数据库表中的数据,如要返回Customers中的数据,就要写一个return  List<Customers>,如果有100张表的话,将会写100个这样的方法。

于是想到了使用List<T>来作为数据的容器,当在界面上传了具体的类型后通过反射去创建接口并使用具体的类型到List中,然后返回数据.这样就减少了大量的代码。

1.在数据访问层,使用一个泛型接口定义要做的功能

namespace DataAccess
{
    /// <summary>
    /// 业务逻辑层访问数据库的接口
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public interface IAccessDB<T> where T : class                 //T代表类型参数,where后面是类型约束
    {
        /// <summary>
        /// 添加数据
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        int Add(T entity);
        /// <summary>
        /// 取得该对象数据表中的所有数据
        /// </summary>
        /// <returns></returns>
        IList<T> GetTAll();
    }
}

2.实现接口

/// <summary>
    /// 实现IAccessDB接口
    /// </summary>
    /// <typeparam name="T"></typeparam>
    class AccessDB<T> : IAccessDB<T> where T : class
    {
       
        #region 构造函数
        public AccessDB()
        {
        }
        #endregion

        #region 虚方法实现多态;子类可以初始化父类
        public virtual ObjectContext GetObjectContext()
        {
            return new NorthwindEntities();
        }
        #endregion

        #region IAccessDB<T> 成员

        public int Add(T entity)
        {
            throw new NotImplementedException();
        }

        public IList<T> GetTAll()
        {
            using (var objectContext=GetObjectContext())
            {
                //创建新的 System.Data.Objects.ObjectSet<TEntity> 实例,
                //该实例用于查询、添加、修改和删除指定实体类型的对象。
                var list = objectContext.CreateObjectSet<T>();
                return list.ToList();
            }
        }

        #endregion
    }

3.工厂类

public class DataAccessFactory
    {
        private readonly IDictionary<String, Object> factory = new Dictionary<String, Object>();
        private static DataAccessFactory instance;//写这个就是实现单件模式

        /// <summary>
        /// 返回数据访问层对对象的实例
        /// </summary>
        /// <returns></returns>
        public static DataAccessFactory GetInstance()
        {
            if (instance == null)
                instance = new DataAccessFactory();//为空就实例化

            return instance;
        }

        public IAccessDB<T> GetAccessDBObj<T>() where T : class          //泛型方法
        {
            Type t = typeof(T);//用于获取类型的 System.Type 对象
            if (factory.ContainsKey("YOYO" + t.FullName))
                return factory["YOYO" + t.FullName] as IAccessDB<T>;//强转成泛型接口;写这个的用意同时表示把之前类型放到字典中,以避免重复调用反射创建接口的实例;因为调用反射会有性能上的损耗
            else
            {
                string className = "DataAccess.AccessDB`1";
                className += "[[" + t.FullName + "," + t.Assembly.FullName + "]]";
                Type type = Type.GetType(className);//获取该类名称的类型
                IAccessDB<T> accessDB = Activator.CreateInstance(type) as IAccessDB<T>;
                factory.Add("YOYO" + t.FullName, accessDB);
                return accessDB;
            }
        }
    }

 4.业务逻辑层的调用方式

public IList<T> GetTableList<T>() where T : class
        {
            IAccessDB<T> accessDB = DataAccessFactory.GetInstance().GetAccessDBObj<T>();
            IList<T> list = accessDB.GetTAll();
            return list;
        }

5.界面调用

               OperateDAL bll = new OperateDAL();
                this.GridView1.DataSource = bll.GetTableList<Customers>();
                this.GridView1.DataBind();

源码下载:http://download.csdn.net/source/3546340

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值