zoukankan      html  css  js  c++  java
  • .NET Core中基类可以反射子类的成员

    我们定义一个类DemoA,再定义一个类DemoB继承DemoA。当构造一个DemoB类对象后,我们可以通过其调用基类DemoA中的方法来反射子类DemoB的成员。

    新建一个.NET Core控制台项目,其代码如下:

    using System;
    
    namespace RF
    {
        /// <summary>
        /// DemoA类为基类
        /// </summary>
        class DemoA
        {
            /// <summary>
            /// 反射DemoA类及其子类的所有属性成员
            /// </summary>
            public void DisplayProperties()
            {
                var properties = this.GetType().GetProperties();
    
                Console.WriteLine($"Properties in class: "{this.GetType().Name}" : ");
    
                foreach (var property in properties)
                {
                    Console.WriteLine($"Property "{property.Name}" in class "{property.DeclaringType.Name}"");
                }
    
                Console.WriteLine();
            }
    
            /// <summary>
            /// DemoA类的属性NumberA会被DisplayProperties方法所反射
            /// </summary>
            public int NumberA { get; set; }
    
            /// <summary>
            /// 由于DemoB类的Name属性隐藏了DemoA类的Name属性,所以在DemoB类中调用DemoA类的DisplayProperties方法时,DemoA类的Name属性不可见,反射的是DemoB类中的Name属性
            /// </summary>
            public string Name { get; set; }
    
            /// <summary>
            /// 由于DemoB类的Age属性重写了DemoA类的Age属性,所以在DemoB类中调用DemoA类的DisplayProperties方法时,DemoA类的Age属性不可见,反射的是DemoB类中的Age属性
            /// </summary>
            public virtual int Age { get; set; }
    
        }
    
        /// <summary>
        /// DemoB类继承DemoA类,在DemoB类的对象上调用DemoA类的DisplayProperties方法时,也会反射DemoB类的所有属性
        /// </summary>
        class DemoB : DemoA
        {
            /// <summary>
            /// DemoB类的属性NumberB也会被DisplayProperties方法所反射
            /// </summary>
            public int NumberB { get; set; }
    
            /// <summary>
            /// 由于DemoB类的Name属性隐藏了DemoA类的Name属性,所以在DemoB类中调用DemoA类的DisplayProperties方法时,DemoA类的Name属性不可见,反射的是DemoB类中的Name属性
            /// </summary>
            public new string Name { get; set; }
    
            /// <summary>
            /// 由于DemoB类的Age属性重写了DemoA类的Age属性,所以在DemoB类中调用DemoA类的DisplayProperties方法时,DemoA类的Age属性不可见,反射的是DemoB类中的Age属性
            /// </summary>
            public override int Age { get; set; }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                DemoA demo = new DemoA();//构造DemoA类对象
                demo.DisplayProperties();//通过DemoA类的对象调用DisplayProperties方法,反射DemoA类的所有属性
    
                demo = new DemoB();//构造DemoB类对象
                demo.DisplayProperties();//通过DemoB类的对象调用DisplayProperties方法,反射DemoB类和DemoA类的所有属性
    
                Console.WriteLine("Press key to quit...");
                Console.ReadKey();
            }
        }
    }

    执行上面的代码,结果如下所示:

    可以看到DemoA类的DisplayProperties方法,不光可以反射DemoA类的所有属性成员,当DisplayProperties方法被DemoB类的对象调用时还可以反射DemoB类的所有属性成员。

  • 相关阅读:
    ExtJS4 动态生成grid出口excel(纯粹的接待)
    oracle10g获得Date类型字段无分,秒的解决方案!
    ubuntu13.10 下一个 g++和gcc 4.8不兼容的问题不能被安装
    简单的导航
    Duanxx的C++学习 : 数字转换String
    图widget--jqplot样品和参数描述的简单演示
    m_Orchestrate learning system---三十、项目中的dist文件一般是做什么的
    开放windows服务器端口-----以打开端口8080为例
    phpstudy一个域名配置两个网站(一个是thinkphp5,一个是原生php)
    双向绑定的具体应用场景有哪些
  • 原文地址:https://www.cnblogs.com/OpenCoder/p/9873225.html
Copyright © 2011-2022 走看看