这里不对“里氏转换”做深入讨论。
正常下父类变量如果是子类实例化的对象,那么这个变量可以直接赋值给子类。
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);