我们定义一个类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. java 包装类和基础数据

    package com.tercher.demo; public class LangClass { public static void main(String[] args) { //所有的包装类 ...

  2. sql: Oracle 11g create table, function,trigger, sequence

    --书藉位置Place目录 drop table BookPlaceList; create table BookPlaceList ( BookPlaceID INT PRIMARY KEY, -- ...

  3. JavaScript初学

    今天学习了js的基础知识,自我归纳如下: 第一部分:js变量的声明和引入 js声明1-直接声明js代码块,使用<script></script>  2-引入外部声明,即创建一个 ...

  4. 使用laravel框架与phantomjs实现截屏功能

    在网上看到的关于phantomjs实现截屏功能很多都是与node结合在一起使用,并需要输入命令才能执行.因此我想要实现输入网址即可截屏并输出图片的功能.示例:http://120.77.171.182 ...

  5. android studio新建项目时出现Error:Execution failed for task ':app:preDebugAndroidTestBuild'.

    android studio更新后创建新项目时出现以下错误 可以用Build->Rebuild Project解决,但这个方法只是临时的,重新打开项目还是会报错 所以用另一种方法: 在app下的 ...

  6. Qt初学——我的第一个UI

    第一次打开Qt的时候,我是一脸懵逼的.没学过c++,里面的程序都看不懂.按照套路,我开始看教程,上手实践.连着搞了3天之后,我开始渐渐明白怎么写UI. 我现在的理解是:UI = 界面设计 + 信号槽响 ...

  7. vue3.0端口号修改

    module.exports = { // 基本路径 baseUrl: '/', // 输出文件目录 outputDir: 'dist', // 生产环境是否生成 sourceMap 文件 produ ...

  8. CentOS 7 yum 安装 Nginx

    1.添加Nginx到YUM源 添加CentOS 7 Nginx yum资源库,打开终端,使用以下命令: sudo rpm -Uvh http://nginx.org/packages/centos/7 ...

  9. Python 装饰器的总结

    先来了解几个定义: 1,函数 在python中,函数通过def关键字.函数名和可选的参数列表定义.通过return关键字返回值.我们举例来说明如何定义和调用一个简单的函数: #coding:UTF8 ...

  10. Sql Server关于日期查询时,如果表中日期到具体某个时间

    1.如果查询日期参数为'2017/02/21',而数据库表中的字段为'2017/02/21 12:34:16.963',则需要格式化一下日期才能查询出来,如下 select * from table ...