在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
架设有两个类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; }
|
请发表评论