我们定义一个类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类的所有属性成员。

.NET Core中基类可以反射子类的成员的更多相关文章

  1. 关于Java中基类构造器的调用问题

    在<Java编程思想>第7章复用类中有这样一段话,值得深思.当子类继承了父类时,就涉及到了基类和导出类(子类)这两个类.从外部来看,导出类就像是一个与基类具有相同接口的新类,或许还会有一些 ...

  2. C++中基类虚析构函数的作用及其原理分析

    虚析构函数的理论前提是 执行完子类的析构函数,那么父类的虚构函数必然会被执行. 那么当用delete释放一个父类指针所实例化的子类对象时,如果没有定义虚析构函数,那么将只会调用父类的析构函数,而不会调 ...

  3. C++ 基类指针,子类指针,多态

    基类指针和子类指针之间相互赋值(1)将子类指针赋值给基类指针时,不需要进行强制类型转换,C++编译器将自动进行类型转换.因为子类对象也是一个基类对象. (2)将基类指针赋值给子类指针时,需要进行强制类 ...

  4. C++ 基类指针和子类指针相互赋值

    首先,给出基类animal和子类fish [cpp] view plaincopy //======================================================== ...

  5. 详解C++中基类与派生类的转换以及虚基类

    很详细!转载链接 C++基类与派生类的转换在公用继承.私有继承和保护继承中,只有公用继承能较好地保留基类的特征,它保留了除构造函数和析构函数以外的基类所有成员,基类的公用或保护成员的访问权限在派生类中 ...

  6. C++中基类的析构函数为什么要用virtual虚析构函数

    知识背景 要弄明白这个问题,首先要了解下C++中的动态绑定. 关于动态绑定的讲解,请参阅:  C++中的动态类型与动态绑定.虚函数.多态实现 正题 直接的讲,C++中基类采用virtual虚析构函数是 ...

  7. 使用.net core中的类DispatchProxy实现AOP

    在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是软件开发中的一个热点,利用A ...

  8. c++中基类与派生类中隐含的this指针的分析

    先不要看结果,看一下你是否真正了解了this指针? #include<iostream> using namespace std; class Parent{ public: int x; ...

  9. C++获取基类指针所指子类对象的类名

    我们在程序中定义了一个基类,该基类有n个子类,为了方便,我们经常定义一个基类的指针数组,数组中的每一项指向都指向一个子类,那么在程序中我们如何判断这些基类指针是指向哪个子类呢? 关键字 typeid, ...

随机推荐

  1. Python 循环删除指定文件夹下所有的.longtian类型文件

    # -*- coding: utf-8 -*- import os #遍历文件夹删除文件 def traversing_dir(rootDir): #遍历根目录 for root,dirs,files ...

  2. 如何在FineReport中解析数据库内XML文件

    在数据库表中,其中字段XML所存的为xml格式数据在表xmltest中.那么在使用该表进行报表制作时,需要将存于xml字段中的值读取出来作为报表数据源. XML每条记录数据格式如下: <Fiel ...

  3. 安装 Zsh 及 Oh-my-zsh

    详细介绍就略过吧,可以参考这篇文章:使用ZSH的九个理由 下面记录一下我在配置ZSH的过程中的要点: 1.基本上你能找到的配置教程都是基于oh-my-zsh的. 因为zsh配置过于复杂,所以有了oh- ...

  4. Compiling a kernel module for the raspberry pi 2 via Ubuntu host

    Compiling a kernel module for the raspberry pi 2 via Ubuntu host Normally compiling a kernel module ...

  5. c++开源日志log4cplus使用开发文档

    下载地址:http://files.cnblogs.com/files/lizhigang/LOG4CPLUS%E5%BC%80%E5%8F%91%E4%B8%8E%E4%BD%BF%E7%94%A8 ...

  6. centos下安装ipython(minglnghang命令行)

    下载文件 wget https://bootstrap.pypa.io/get-pip.py --no-check-certificate 执行安装 python get-pip.py 这就安装好了 ...

  7. JavaScript 模块化入门

    理解模块 模块打包构建 webpack牛刀小试

  8. Java 设计模式(三)-单例模式(Singleton Pattern)

    1     概念定义 1.1   定义 确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 1.2   类型 创建类模式 1.3   难点 1)多个虚拟机 当系统中的单例类被拷贝运行在多 ...

  9. leetcode Ch8-Others

    1. Rotate Image 旋转图像 顺时针旋转90度:先沿水平线翻转,再沿主对角线翻转. 逆时针旋转90度:先沿竖直线翻转,再沿主对角线翻转. 顺时针旋转180度:水平翻转和竖直翻转各一次. 逆 ...

  10. 让UpdatePanel支持文件上传(2):服务器端组件 .

    我们现在来关注服务器端的组件.目前的主要问题是,我们如何让页面(事实上是ScriptManager控件)认为它接收到的是一个异步的回送?ScriptManager控件会在HTTP请求的Header中查 ...