C#中父類的值向子類復制


架設有兩個類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;
        }

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM