「C#」父类转子类

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

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

Parent A = new Child();

Child B = A as Child;

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

即下面这样就不行。

Parent A = new Paren();

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

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

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

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

public class Child : Parent
{
    /// 
    /// 子类构造函数
    /// 
    /// 父类对象
    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);
            }
        }
    }
    
    /// 
    /// 子类附加属性
    /// 
    public string AdditionalAttributes { get; set; }
}

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

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

你可能感兴趣的:(假装会写C#,c#,开发语言)