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

      

  • 相关阅读:
    PHP_Code_challenge(代码审计)
    超全局变量$GLOBALS
    upload-labs(文件上传)
    CTF bugku 论剑场 web20
    多次Printf()是否使用用同一栈帧的参数?
    (转载于度盘)小迪安全渗透-学习讲义
    SQL数据库操作练习(2)
    .htaccess绕过
    PHP序列化思考(9.14已修改)
    SQL数据库操作练习(1)
  • 原文地址:https://www.cnblogs.com/isenhome/p/2870247.html
Copyright © 2011-2022 走看看