C#中父類的值向子類復(fù)制

原文連接https://blog.csdn.net/dragon_ton/article/details/52818008
架設(shè)有兩個(gè)類AParent和AChild。

其中,AChild派生自AParent。

AParent這個(gè)類來(lái)自于數(shù)據(jù)庫(kù),由ORM為我們生成和創(chuàng)建。而AChild這個(gè)類主要是為了配合前臺(tái)頁(yè)面的顯示【通常在MVC中實(shí)現(xiàn)編輯功能時(shí)用到?!?/p>

根據(jù)面向?qū)ο蟮脑?,我們可以拿“子類”?dāng)“父類”使用。但是不能拿“父類”當(dāng)“子類”使用。

舉一個(gè)很簡(jiǎn)單的例子。比如我們有兩個(gè)方法:GetParentName(AParent parent)和GetChildName(AChild child)。

那么,當(dāng)我們調(diào)用GetParentName方法時(shí),將AChild的實(shí)體作為參數(shù)調(diào)用是可行等。

但是當(dāng)我們調(diào)用GetChildName方法時(shí),確不能將AParent的實(shí)體作為參數(shù)來(lái)調(diào)用。

有時(shí)候,為了滿足前臺(tái)顯示的要求,我們必須使用AChild作為Model。但是從ORM中得到的是AParent,不能直接傳遞給視圖。這樣的話,程序員就不得不編寫(xiě)N行冗長(zhǎng)而且毫無(wú)趣味的代碼,來(lái)滿足這個(gè)“合理的要求”。

但是,如果你是一個(gè)聰明的程序員,是一個(gè)懂得生活的程序員,是一個(gè)懂得對(duì)自己好的程序員,那么,上面所訴說(shuō)的事情,你是絕對(duì)不會(huì)讓它發(fā)生的。

雖然,我承認(rèn),上面的三條我不一定能夠百分之百做到,但是,有一件事情是肯定的:我絕對(duì)不允許這樣的事情發(fā)生!

懂得對(duì)自己好的程序員,才是一個(gè)合格的程序員。 來(lái)自:大石頭。

我們可以這么考慮,既然AChild派生自AParent,那么也就是說(shuō),AParent所擁有的所有的屬性,方法,在AChild中,都是有的。那么,我們就可以通過(guò)“反射”,來(lái)解決這個(gè)問(wèn)題。

可能一提到“反射”,立馬就會(huì)有很多人發(fā)表見(jiàn)解:“哎呀,反射的效率不高啊……”,“反射的速度慢呀……”。

每每看到這些評(píng)論,我總是一笑而過(guò)。“反射”是很慢。但是,在任何情況下都很慢嗎?任何技術(shù),只要用對(duì)了場(chǎng)景,那么就是一個(gè)很好的技術(shù)。

需要用到AParent向AChild復(fù)制的環(huán)境是在編輯狀態(tài)下。而且我現(xiàn)在所開(kāi)發(fā)的是后臺(tái)。一個(gè)后臺(tái)能有多少個(gè)人使用?后臺(tái)的編輯功能每秒有多少個(gè)需求?耗時(shí)百毫秒級(jí)別的反射對(duì)于整個(gè)后臺(tái)程序來(lái)說(shuō),難道不微不足道嗎?

====牢騷的話就此打住,咱們?cè)撜麄€(gè)硬菜====

其實(shí),核心代碼并沒(méi)有多少,短短的五六行即可。但是這短短的五六行卻蘊(yùn)含了兩個(gè)知識(shí)點(diǎn):泛型,反射。有什么不清楚的盡可能提出來(lái)。知無(wú)不答。

public static TChild AutoCopy<TParent, TChild>(TParent parent) where TChild : TParent, new ()
{
TChild child = new TChild();
var ParentType = typeof (TParent);
var Properties = ParentType.GetProperties();
foreach ( var Propertie in Properties)
{
//循環(huán)遍歷屬性
if (Propertie.CanRead && Propertie.CanWrite)
{
//進(jìn)行屬性拷貝
Propertie.SetValue(child, Propertie.GetValue(parent, null ), null );
}
}
return child;
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前端開(kāi)發(fā)面試題 面試題目: 根據(jù)你的等級(jí)和職位的變化,入門級(jí)到專家級(jí),廣度和深度都會(huì)有所增加。 題目類型: 理論知...
    怡寶丶閱讀 2,694評(píng)論 0 7
  • <a name='html'>HTML</a> Doctype作用?標(biāo)準(zhǔn)模式與兼容模式各有什么區(qū)別? (1)、<...
    clark124閱讀 3,861評(píng)論 1 19
  • HTML, HTTP,web綜合問(wèn)題 1、前端需要注意哪些SEO 合理的 title 、 description ...
    唐十八閱讀 1,167評(píng)論 0 1
  • 今天青石的票圈出鏡率最高的,莫過(guò)于張藝謀的新片終于定檔了。 一張滿溢著水墨風(fēng)的海報(bào)一次次的出現(xiàn)在票圈里,也就是老謀...
    青石電影閱讀 11,002評(píng)論 1 2
  • 董多嬌第226天堅(jiān)持分享,焦點(diǎn)相信,每個(gè)人在每一刻都會(huì)為自己做出一個(gè)決定與選擇,是他們當(dāng)時(shí)認(rèn)為最合適自己的,所以任...
    良知良能良知良能閱讀 3,955評(píng)論 1 2

友情鏈接更多精彩內(nèi)容