父类与子类之间赋值转换
首先,根据继承关系,父类是无法转化为子类的,但是在某些情况下,会需要在父类的基础上进行扩展,并且需要将原父类的数据填充到新的扩展类中。
实体类:
class Person { public int Uid { get; set; } public string Name { get; set; } private string _Password; public string PassWord { get { return _Password; } } public void SetPassword(string password) { _Password = password; } } class Student:Person { public string flag { get; set; } }
1、正常强制转换则获得null值
public static void a() { //此处进行强制转换, 获得student为null Student student = new Person() { Uid = 123, Name = "name123" } as Student; }
2、子类可以抛弃一些属性,强制转化为父类,并且在需要的地方可以再将此父类在转换回子类。
public static void b() { //此处进行便可进行正常转换。个人认为可根据内存和指针解释通。 Person person = new Student() {Uid=123,Name="name123",flag="flag123" }; Student student1 = person as Student; }
3、反射获得对象属性,循环赋值,将原父类对象值赋予扩展类。
public static Student test(Person p) { Student student = new Student(); foreach (var propertyInfo in typeof(Person).GetProperties()) { student.GetType().GetProperty(propertyInfo.Name).SetValue(student, Convert.ChangeType(propertyInfo.GetValue(p, null), student.GetType().GetProperty(propertyInfo.Name).PropertyType), null); } Console.WriteLine(student.PassWord); return student; }
这种转换方式的前提,所有的属性都是可读写的,如果存在只读属性则无法进行赋值。为解决只读属性问题可以修改扩展类,覆盖掉父类中只读属性。
class Student:Person { public string flag { get; set; } public new string PassWord { get; set; }//使用new关键字 //public virtual string PassWord { get; set; }//或者使用virtual关键字
//都可以覆盖掉父类对象只读属性,并进行赋值。 }