泛型使用札记

2009-09-18  籽藤 

  毕设选题是“基于SaaS的数据库客户端”。网上有个开源的isqlweb给了我不少帮助,但是它并没有面向多数据库,且没有面向接口编程。为了满足多数据库类型的连接需求,我在接口中用到了泛型。如:

namespace Jxmstc.Sop.DbClient.IBLL
{
    public interface IConnection<T>
    {
        T CreateConn(ConnectionInfo conInfo);

        void OpenConn(T conn);

        void CloseConn(T conn);
    }
}

一、类型转换

其他类型转换为泛型

        /// <summary>
        /// 创建连接
        /// </summary>
        /// <param name="conInfo">自定义的类对象</param>
        /// <returns>连接对象</returns>
        public T CreateConn(ConnectionInfo conInfo)
        {
            SqlConnection sqlCon = new SqlConnection();

            if (conInfo != null)
            {

                string strConn = string.Format("server={0};uid={1};pwd={2};database=master;Asynchronous Processing=true;"
                    , conInfo.Server.Replace(";", ""), conInfo.UserName.Replace(";", ""), conInfo.Pwd.Replace(";", ""));

                sqlCon.ConnectionString = strConn;

            }

            object b=(object)sqlCon;

            return  (T)b;

        }

  看到了吧,我把SqlConnection对象转换为object,再转换为T。直接写(T)SqlCon,编译都通过不了。

泛型转换为其他类型

        /// <summary>
        /// 打开连接
        /// </summary>
        /// <param name="conn">连接对象</param>
        public void OpenConn(T conn)
        {
           
            SqlConnection sqlconn=(object)conn as SqlConnection ;

            if (sqlconn == null) return;

                if(sqlconn .State!=ConnectionState .Open ){
               
                    sqlconn .Open ();
                }
        }

 还是得通过object对象进行转换。

二、通过反射动态创建泛型对象

既然面向多数据库,当然有个DBFactory类啦。通过反射机制,找到相应的实现了IBLL的BLL命名空间中的类。一般的类,通过assembly+ClassName就可以反射,进行缓存处理。而泛型类则不然,即:

        /// <summary>
        /// 创建连接
        /// </summary>
        /// <typeparam name="T">连接对象类型 如:SqlConnection</typeparam>
        /// <returns></returns>
        public static IConnection<T> CreateConnnection<T>() {

            Type type = typeof(Connection<T>);
            object o=Activator .CreateInstance (type);

            return (IConnection<T>)o;
        }

 

 

 

282°/2827 人阅读/0 条评论 发表评论

登录 后发表评论