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;
        }

  

转载于:https://www.cnblogs.com/Soar1991/archive/2012/11/04/2754319.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值