架設有兩個類AParent和AChild。
其中,AChild派生自AParent。
AParent這個類來自於數據庫,由ORM為我們生成和創建。而AChild這個類主要是為了配合前台頁面的顯示【通常在MVC中實現編輯功能時用到。】
根據面向對象的原理,我們可以拿“子類”當“父類”使用。但是不能拿“父類”當“子類”使用。
舉一個很簡單的例子。比如我們有兩個方法:GetParentName(AParent parent)和GetChildName(AChild child)。
那么,當我們調用GetParentName方法時,將AChild的實體作為參數調用是可行等。
但是當我們調用GetChildName方法時,確不能將AParent的實體作為參數來調用。
有時候,為了滿足前台顯示的要求,我們必須使用AChild作為Model。但是從ORM中得到的是AParent,不能直接傳遞給視圖。這樣的話,程序員就不得不編寫N行冗長而且毫無趣味的代碼,來滿足這個“合理的要求”。
但是,如果你是一個聰明的程序員,是一個懂得生活的程序員,是一個懂得對自己好的程序員,那么,上面所訴說的事情,你是絕對不會讓它發生的。
雖然,我承認,上面的三條我不一定能夠百分之百做到,但是,有一件事情是肯定的:我絕對不允許這樣的事情發生!
懂得對自己好的程序員,才是一個合格的程序員。 來自:大石頭。
我們可以這么考慮,既然AChild派生自AParent,那么也就是說,AParent所擁有的所有的屬性,方法,在AChild中,都是有的。那么,我們就可以通過“反射”,來解決這個問題。
可能一提到“反射”,立馬就會有很多人發表見解:“哎呀,反射的效率不高啊……”,“反射的速度慢呀……”。
每每看到這些評論,我總是一笑而過。“反射”是很慢。但是,在任何情況下都很慢嗎?任何技術,只要用對了場景,那么就是一個很好的技術。
需要用到AParent向AChild復制的環境是在編輯狀態下。而且我現在所開發的是后台。一個后台能有多少個人使用?后台的編輯功能每秒有多少個需求?耗時百毫秒級別的反射對於整個后台程序來說,難道不微不足道嗎?
====牢騷的話就此打住,咱們該整個硬菜====
其實,核心代碼並沒有多少,短短的五六行即可。但是這短短的五六行卻蘊含了兩個知識點:泛型,反射。有什么不清楚的盡可能提出來。知無不答。
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) { //循環遍歷屬性 if (Propertie.CanRead && Propertie.CanWrite) { //進行屬性拷貝 Propertie.SetValue(child, Propertie.GetValue(parent, null), null); } } return child; }