zoukankan      html  css  js  c++  java
  • 父类与子类之间赋值转换

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

    实体类:

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

      

  • 相关阅读:
    游戏引擎架构
    前瞻设计:创新型战略推动可持续变革(全彩)
    解放创意——自由人的自由联合
    python2中的__init__.py文件的作用
    python导入模块时的执行顺序
    json使用
    JQuery基本语法(部分)
    谷歌开发者工具使用
    pythonseleniumAPI
    静态、自适应、流式、响应式四种网页布局的区别
  • 原文地址:https://www.cnblogs.com/isenhome/p/2870247.html
Copyright © 2011-2022 走看看