• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#中父类的值向子类复制

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

架设有两个类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;
        }

  


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap