首先,根据继承关系,父类是无法转化为子类的,但是在某些情况下,会需要在父类的基础上进行扩展,并且需要将原父类的数据填充到新的扩展类中。
实体类:
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关键字
//都可以覆盖掉父类对象只读属性,并进行赋值。
}