「C#」父类转子类

这里不对“里氏转换”做深入讨论。

正常下父类变量如果是子类实例化的对象,那么这个变量可以直接赋值给子类。

Parent A = new Child();

Child B = A as Child;

这里的父类变量A本身就是子类实体,自然可以直接转换。换句话说,用“一个人”来代指“某个男人”,自然可以用“一个男人”来重新代替“一个人”,但反过,“一个人”代指“某个人”,就不知道男女,就不能用“一个男人”来代指。

即下面这样就不行。

Parent A = new Paren();

Child B = A as Child;//错误!

但是需求总是有的,一个子类继承父类,并扩充了一些属性,数据源是父类的,需要转成子类并使用扩充的属性来处理业务。

子类的构造方法用父类做参数,将所有共同属性都赋值一遍。

用反射的方式实现,代码如下:

public class Child : Parent
{
    /// <summary>
    /// 子类构造函数
    /// </summary>
    /// <param name="parent">父类对象</param>
    public Child(Parent parent)
    {
        var parentProperties = parent.GetType().GetProperties();
        foreach (var parentProperty in parentProperties)
        {
            var thisProperty = this.GetType().GetProperty(parentProperty.Name, parentProperty.PropertyType);
            var value = parentProperty.GetValue(parent);
            if (thisProperty != null && value != null && thisProperty.CanWrite)
            {
                thisProperty.SetValue(this, value);
            }
        }
    }
    
    /// <summary>
    /// 子类附加属性
    /// </summary>
    public string AdditionalAttributes { get; set; }
}

这样,在使用时就方便转换了。

Parent A = new Parent();
Child B = new Child(A);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值