原文: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#数组1

    using System; namespace ConsoleApp3 { class Program { static void Main(string[] args) { , , , , , }; ...

  2. Python读写Excel文件的实例

    最近由于经常要用到Excel,需要根据Excel表格中的内容对一些apk进行处理,手动处理很麻烦,于是决定写脚本来处理.首先贴出网上找来的读写Excel的脚本. 1.读取Excel(需要安装xlrd) ...

  3. .NET MVC5简介(二)

    MVCApplication---Application_Statr--RegisterRoutes--给RouteCollection添加规则,请求进到网站---X----请求地址被路由按照顺序匹配 ...

  4. react-native聊天室|RN版聊天App仿微信实例|RN仿微信界面

    一.前言 9月,又到开学的季节.为每个一直默默努力的自己点赞!最近都沉浸在react native原生app开发中,之前也有使用vue/react/angular等技术开发过聊天室项目,另外还使用RN ...

  5. 在Dynamis CRM中打造一键保存关闭刷新案例的功能

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复172或者20151114可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! 我们知道在Dynamics CR ...

  6. Discuz! X3 数据表、数据字段说明

    pre_common_admincp_cmenu 后台菜单收藏表 字段名 数据类型 默认值 允许非空 自动递增 备注 id smallint(6) unsigned    NO 是   title v ...

  7. go构建脚本ansible分发时出现的问题总结“non-zero return code”

    背景介绍: 在Jenkins服务器配置go项目发布脚本,编译完成后,使用ansible分发到部署服务器上,然后将启动项目脚本start_coachcore.sh发布到目标服务器上,执行启动,目标服务器 ...

  8. linux修改权限

    修改system目录(包括子目录)的所有者和组 sudo chown -R seven:seven system

  9. is ==的区别 编码和解码

    1.n=0 n1=0 print(n==n1) ==>true  == 是比较两边的值 2.a="alex " b="alex" print(a==b)= ...

  10. 2019面向对象程序设计(java)课程学习进度条

    2019面向对象程序设计(java)课程学习进度条 周次 (阅读/编写)代码行数 发布博客量/评论他人博客数量 课余学习时间(小时) 学习收获最大的程序阅读或编程任务 1 20/10 1/0 5 九九 ...