文章出處

回到目錄

泛型方法:是一個抽象的概念,將批量具有共性的操作進行抽象,使用泛型類型來表示這個方法,實現這些類型的方法具有相同的邏輯,而唯一不同的是,它們的類型,即類型在泛型方法里是個變量,這話感覺是用肺說出來的,呵呵!

今天在做開發時,遇到了這個問題,最后重構了自己的代碼,重構后,使用了泛型方法,感覺代碼美麗多了

沒用泛型方法前

      /// <summary>
        /// 更新老師與學生的關系
        /// </summary>
        /// <param name="list">要插入的關系列表</param>
        /// <param name="isAll">是否為全部,如果全部,不需要向關系表插入</param>
        /// <param name="teacherId">當前老師ID</param>
        /// <param name="type">類型:0視頻,1作業,3文檔</param>
        public void AddUser_Source_R(List<User_Source_R> list, bool isAll, int teacherId, int objId, int objType)
        {

            switch (objType)
            {
                case 0:
                    var respository1 = LoadRepository<Classroom_Info>();
                    var entity1 = LoadRepository<Classroom_Info>().Find(objId);
                    if (isAll)
                    {
                        entity1.AccessStatus = 0;
                        respository1.Update(entity1);
                    }
                    else
                    {
                        entity1.AccessStatus = 1;
                        respository1.Update(entity1);
                        LoadRepository<User_Source_R>().Insert(list);
                    }
                    break;
                case 1:
                    var respository2 = LoadRepository<Courseware_Info>();
                    var entity2 = LoadRepository<Courseware_Info>().Find(objId);
                    if (isAll)
                    {
                        entity2.AccessStatus = 0;
                        respository2.Update(entity2);
                    }
                    else
                    {
                        entity2.AccessStatus = 1;
                        respository2.Update(entity2);
                        LoadRepository<User_Source_R>().Insert(list);
                    }
                    break;
                case 2:
                    var respository3 = LoadRepository<Task_Info>();
                    var entity3 = LoadRepository<Task_Info>().Find(objId);
                    if (isAll)
                    {
                        entity3.AccessStatus = 0;
                        respository3.Update(entity3);
                    }
                    else
                    {
                        entity3.AccessStatus = 1;
                        respository3.Update(entity3);
                        LoadRepository<User_Source_R>().Insert(list);
                    }
                    break;
                case 3:
                    var respository4 = LoadRepository<Substance_Info>();
                    var entity4 = LoadRepository<Substance_Info>().Find(objId);
                    if (isAll)
                    {
                        entity4.AccessStatus = 0;
                        respository4.Update(entity4);
                    }
                    else
                    {
                        entity4.AccessStatus = 1;
                        respository4.Update(entity4);
                        LoadRepository<User_Source_R>().Insert(list);
                    }
                    break;
                default:
                    throw new ArgumentException();
            }


        }

用了泛型方法后

        /// <summary>
        /// 更新老師與學生的關系
        /// </summary>
        /// <param name="list">要插入的關系列表</param>
        /// <param name="isAll">是否為全部,如果全部,不需要向關系表插入</param>
        /// <param name="teacherId">當前老師ID</param>
        /// <param name="type">>資源類型0課程,1視頻,2作業,3文檔</param>
        public void AddUser_Source_R(
            List<User_Source_R> list,
            bool isAll,
            int objId,
            int objType)
        {
            switch (objType)
            {
                case 0:
                    UpdateSource_R<Classroom_Info>(list, isAll, objId);
                    break;
                case 1:
                    UpdateSource_R<Courseware_Info>(list, isAll, objId);
                    break;
                case 2:
                    UpdateSource_R<Task_Info>(list, isAll, objId);
                    break;
                case 3:
                    UpdateSource_R<Substance_Info>(list, isAll, objId);
                    break;
                default:
                    throw new ArgumentException();
            }


        }

        /// <summary>
        /// 泛型方法來干這邏輯相同,只是類型不同的事情
        /// </summary>
        /// <typeparam name="TEntity"></typeparam>
        /// <param name="list"></param>
        /// <param name="isAll"></param>
        /// <param name="teacherId"></param>
        /// <param name="objId"></param>
        /// <param name="objType"></param>
        void UpdateSource_R<TEntity>(
            List<User_Source_R> list,
            bool isAll,
            int objId)
            where TEntity : class, IAccess
        {
            var entity = LoadRepository<TEntity>().Find(objId);
            if (isAll)
            {
                entity.AccessStatus = 0;
                LoadRepository<TEntity>().Update(entity);
            }
            else
            {
                entity.AccessStatus = 1;
                LoadRepository<TEntity>().Update(entity);
                LoadRepository<User_Source_R>().Insert(list);
            }
        }

我們可以看是,泛型方法把不變的邏輯抽象在一起,這樣,有利于代碼的擴展和維護,這才是面向對象的代碼!

回到目錄


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()