原文連接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;
}