原文:2019-11-26-C#-判断方法是否被子类重写

title author date CreateTime categories
C# 判断方法是否被子类重写
lindexi
2019-11-26 08:49:55 +0800
2019-11-26 08:42:17 +0800
C#

本文告诉大家如何通过反射判断某个方法是否被基类重写

在 C# 如果在类定义 virtual 的方法,那么可以在子类重写,如何判断一个方法被子类可以通过反射

例如创建一个 Foo 定义 Test 虚方法

    class Foo
{
public virtual void Test()
{ }
}

在 Foo 代码可以通过 GetType() 方法获取当前的类,如果是可以拿到 Foo 类对象,通过调用 GetType() 方法可以获取对象的类

在 Foo 写 IsOverride 用来判断 Test 方法是否被重写

        public bool IsOverride()
{
return !(GetType().GetMethod("Test").DeclaringType == typeof(Foo));
}

如果是判断其他方法,请替换 "Test" 为对应方法,上面判断方法对属性也可以

如下面代码写 F1 继承重写方法

    class F1 : Foo
{
/// <inheritdoc />
public override void Test()
{
}
}

运行下面代码可以看到 F1 类输出的是重写方法

        static void Main(string[] args)
{
Foo f1 = new F1(); Console.WriteLine(f1.IsOverride()); // true f1 = new Foo();
Console.WriteLine(f1.IsOverride()); // false
}

除了上面方法判断重写,可以使用下面方法判断方法是否重写

            var methodInfo = GetType().GetMethod("Test");
if (methodInfo != methodInfo.GetBaseDefinition())
{
// 重写
}

判断是否重写方法需要使用反射,性能会比较低,如果多次使用,建议缓存。因为类是不能运行时修改的,所以只需要获取类就可以知道是否重写

本文代码放在 github 欢迎小伙伴访问

Detect if a method was overridden using Reflection (C#) - Stack Overflow

2019-11-26-C#-判断方法是否被子类重写的更多相关文章

  1. java继承-子类调用父类的方法中包含子类重写的方法

    # 看题目是不是很绕,这个我也不知道怎么才能更简单的表达了... # 先看代码: public class Common { public static void main(String[] args ...

  2. Java学习笔记13---如何理解“子类重写父类方法时,返回值若为类类型,则必须与父类返回值类型相同或为其子类”

    子类重新实现父类的方法称重写:重写时可以修改访问权限修饰符和返回值,方法名和参数类型及个数都不可以修改:仅当返回值为类类型时,重写的方法才可以修改返回值类型,且必须是父类方法返回值的子类:要么就不修改 ...

  3. Goland 2020.2.x 激活码永久破解教程 (最新Goland激活码!2020.11.26亲测可用!)

    在2020.11.26 Goland的用户们又迎来了一次更新,这就导致很多软件打开时候就提示Goland激活码已经失效,码小辫第一时间给各位分享了关于最新Goland激活破解教程! goland已经更 ...

  4. ssh The authenticity of host '10.11.26.2 (10.11.26.2)' can't be established

    The authenticity of host '10.11.26.2 (10.11.26.2)' can't be established. ECDSA key fingerprint is SH ...

  5. string源码分析 ——转载 http://blogs.360.cn/360cloud/2012/11/26/linux-gcc-stl-string-in-depth/

    1. 问题提出 最近在我们的项目当中,出现了两次与使用string相关的问题. 1.1. 问题1:新代码引入的Bug 前一段时间有一个老项目来一个新需求,我们新增了一些代码逻辑来处理这个新需求.测试阶 ...

  6. String类的常用判断方法使用练习

    选取了一些常用的判断方法进行了使用练习,后续跟新其他方法 package StringDemo; // String类的判断方法解析 // 1:boolean equals(); // 判断字符串是否 ...

  7. QUnit使用笔记-1判断方法

    QUnit是一个前端测试工具. 判断效果: html基本结构: <h1 id="qunit-header">QUnit</h1> <h2 id=&qu ...

  8. sql语句判断方法之一

    sql语句判断方法之一CASE语句用法总结 背景: Case具有两种格式.简单Case函数和Case搜索函数. --简单Case函数 CASE sex WHEN '1' THEN '男' WHEN ' ...

  9. 自己写一个与startWith类似的判断方法

    package com.hanqi.lianxi; import java.util.Scanner; public class startWith {        //自己顶一个与startWit ...

随机推荐

  1. C#命名规则和设计规则

    Pascal 将每个单词的第一个字符大写.遇到两个字母的首字母缩略词时,两个字母都要大写 命名空间:使用公司名作为前缀.在第二级名称中使用稳定的与版本无关的产品名称 类型:名词或名词短语命名 结构:名 ...

  2. springMVC校验器(validator)

    springmvc使用的是Hibernate Validator(和Hibernate的ORM无关)来完成校验功能 一.普通校验 1.导入jar包 2.编写校验错误配置文件 3.配置校验错误信息文件 ...

  3. Python中的函数参数有冒号 声明后有-> 箭头

    在python3.7 环境下 函数声明时能在参数后加冒号,如图: def f(ham: str, eggs: str = 'eggs') -> str : print("Annotat ...

  4. Android studio down 的项目中文出现 乱码

    发现down的项目file->open找到文件夹打开,里面少很多东西,像build.grade(好像拼错了). 这个问题是要file->import progect找到文件夹打开,as会自 ...

  5. Java自学-I/O 数据流

    Java 数据流DataInputStream ,DataOutputStream DataInputStream 数据输入流 DataOutputStream 数据输出流 步骤 1 : 直接进行字符 ...

  6. 【win10】通过环境变量来快速打开应用程序

    step1:建一个空文件夹,并把文件夹路径复制到剪贴板. step2:依次右键点击“此电脑”.属性.高级系统设置.环境变量,定位到“系统变量”,点击新建. (说明:环境变量分为用户变量和系统变量,用户 ...

  7. Verilog语言框架

    一.常用关键字

  8. Jmeter Question 之“集成Ant+Jenkins自动化”

    首先介绍一下Ant.Apache Ant,是一个将软件编译.测试.部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发.由Apache软件基金会所提供. 是的.还是Apache家 ...

  9. 6.web3

    http://123.206.87.240:8002/web3/

  10. LeetCode 739 每日温度

    1.直接遍历 暴力求解 class Solution { public: vector<int>dailyTemperatures(vector<int>& T) { ...