泛型

ORM實(shí)現(xiàn)有反射固耘、泛型题篷、代碼生成等幾種常見(jiàn)方式厅目,或者單用番枚,或者混合。

c#的泛型非常強(qiáng)大损敷,應(yīng)用于ORM時(shí)葫笼,可能有些特性顯得更重要。

一開(kāi)始實(shí)現(xiàn)coat時(shí)嗤锉,我嘗試寫一下代碼做為ORM基類

namespace Coat
{
    public class ORMBase<T> where T : class
    {
        ...
        public bool Update()
        {
            using (var conn = OpenConnection())
            {
                //Beblow compile error, because conn.Update<T> expect parameter to be T
                //i.e. the sub-class, but "this" is parent class.
                return conn.Update<T>(this);
            }
        }
    }
}

// 子類生成的代碼類似:
    public class User: ORMBase<User> {
    ...
    }

意圖是在基類中實(shí)現(xiàn)ActiveRecord對(duì)象增刪改查等通用方法渔欢,相比起在具體子類中使用代碼生成實(shí)現(xiàn)相應(yīng)的代碼會(huì)更簡(jiǎn)潔些。并且瘟忱,編輯一個(gè)實(shí)際類型奥额,總比編輯模板方便。

做為一個(gè)玩了兩年沒(méi)有泛型的語(yǔ)言(GO)的人访诱,我會(huì)覺(jué)得 c# class User: ORMBase<User> { 這樣的類型聲明很強(qiáng)大垫挨。

User類型繼承于ORMBase<T>,而類型ORMBase<T>正是使用User類型做為范型參數(shù)触菜。這沒(méi)有循環(huán)依賴九榔?

這樣ORMBase中,便可以利用泛型T做各種編程涡相。

上面代碼是卡在了conn.Update<T>(this);這句調(diào)用哲泊。

因?yàn)閐apper的Update方法簽名類似Update<T>(T entityToUpdate),我在ORMBase<T>中寫的this是父類催蝗,也就是ORMBase<T>切威;而傳進(jìn)去給Update的類型參數(shù)T,則是子類丙号,比方說(shuō)User先朦。

編譯器直接就報(bào)錯(cuò)了。

ORMBase<T>跟T是兩個(gè)不同的類型犬缨,無(wú)法直接轉(zhuǎn)換喳魏,寫conn.Update<T>((T)this);編譯器也是報(bào)錯(cuò)。

有同事建議修改ORMBase的Update簽名怀薛,變成public bool Update(T obj)刺彩,然后把傳obj而不是this給dapper。

這樣雖然可以解決編譯問(wèn)題,但會(huì)讓應(yīng)用調(diào)用時(shí)變麻煩创倔;還不如直接把Update方法搬去子類里面生成出來(lái)三热,但還是不漂亮。

研究了一番泛型約束三幻,結(jié)果找到更漂亮的方式就漾。

ORMBase<T>跟T無(wú)法相互轉(zhuǎn)換是因?yàn)榫幾g器不知道他們之間的繼承關(guān)系,把他們的繼承關(guān)系寫到范型約束中便可以轉(zhuǎn)換了念搬。

public class RecordBase<T> where T : RecordBase<T>

這樣聲明約束T必須是RecordBase<T>的子類抑堡;Update方法改為:

return conn.Update<T>((T)this);

便可以順利編譯了。

雖然可以編譯朗徊,但這里是把父類轉(zhuǎn)換為子類首妖,何以可以順利編譯,我其實(shí)還木有搞明白細(xì)節(jié)爷恳。

有朋友知道有缆,還望告知。

謝謝温亲。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末棚壁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子栈虚,更是在濱河造成了極大的恐慌袖外,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件魂务,死亡現(xiàn)場(chǎng)離奇詭異曼验,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)粘姜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門鬓照,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人孤紧,你說(shuō)我怎么就攤上這事豺裆。” “怎么了坛芽?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵留储,是天一觀的道長(zhǎng)翼抠。 經(jīng)常有香客問(wèn)我咙轩,道長(zhǎng),這世上最難降的妖魔是什么阴颖? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任活喊,我火速辦了婚禮,結(jié)果婚禮上量愧,老公的妹妹穿的比我還像新娘钾菊。我一直安慰自己帅矗,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布煞烫。 她就那樣靜靜地躺著浑此,像睡著了一般。 火紅的嫁衣襯著肌膚如雪滞详。 梳的紋絲不亂的頭發(fā)上凛俱,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音料饥,去河邊找鬼蒲犬。 笑死,一個(gè)胖子當(dāng)著我的面吹牛岸啡,可吹牛的內(nèi)容都是我干的原叮。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼巡蘸,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼奋隶!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起悦荒,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤达布,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后逾冬,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體黍聂,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年身腻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了产还。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嘀趟,死狀恐怖脐区,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情她按,我是刑警寧澤牛隅,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站酌泰,受9級(jí)特大地震影響媒佣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜陵刹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一默伍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦也糊、人聲如沸炼蹦。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)掐隐。三九已至,卻和暖如春钞馁,著一層夾襖步出監(jiān)牢的瞬間瑟枫,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工指攒, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留慷妙,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓允悦,卻偏偏與公主長(zhǎng)得像膝擂,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子隙弛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • object 變量可指向任何類的實(shí)例架馋,這讓你能夠創(chuàng)建可對(duì)任何數(shù)據(jù)類型進(jìn)程處理的類。然而全闷,這種方法存在幾個(gè)嚴(yán)重的問(wèn)題...
    CarlDonitz閱讀 910評(píng)論 0 5
  • 引言:泛型一直是困擾自己的一個(gè)難題叉寂,但是泛型有時(shí)一個(gè)面試時(shí)老生常談的問(wèn)題;今天作者就通過(guò)查閱相關(guān)資料簡(jiǎn)單談?wù)勛约簩?duì)...
    cp_insist閱讀 1,838評(píng)論 0 4
  • 一总珠、為什么要使用泛型 1.類型參數(shù)的好處 類型安全:泛型的主要目標(biāo)是提高 Java 程序的類型安全屏鳍。通過(guò)知道使用泛...
    SeanMa閱讀 7,063評(píng)論 1 18
  • 我們知道,使用變量之前要定義局服,定義一個(gè)變量時(shí)必須要指明它的數(shù)據(jù)類型钓瞭,什么樣的數(shù)據(jù)類型賦給什么樣的值。 假如我們現(xiàn)在...
    今晚打肉山閱讀 975評(píng)論 0 1
  • 第8章 泛型 通常情況的類和函數(shù)淫奔,我們只需要使用具體的類型即可:要么是基本類型山涡,要么是自定義的類。但是在集合類的場(chǎng)...
    光劍書(shū)架上的書(shū)閱讀 2,143評(píng)論 6 10