父类与子类之间赋值转换

首先,根据继承关系,父类是无法转化为子类的,但是在某些情况下,会需要在父类的基础上进行扩展,并且需要将原父类的数据填充到新的扩展类中。

实体类:

    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关键字
     //都可以覆盖掉父类对象只读属性,并进行赋值。 }

  

posted @ 2013-01-21 18:37  逸新  阅读(4441)  评论(0编辑  收藏  举报