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

原文: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

原文地址:https://www.cnblogs.com/lonelyxmas/p/12075874.html

时间: 2024-11-08 14:33:19

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

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

# 看题目是不是很绕,这个我也不知道怎么才能更简单的表达了... # 先看代码: public class Common { public static void main(String[] args) { Sub sub = new Sub(); sub.testSub(); } } class Parent { protected boolean test() { throw new RuntimeException(); } protected void testParent() { if

11.25 配置防盗链;11.26 访问控制Directory;11.27 访问控制FilesMatch

扩展: 几种限制ip的方法 http://www.lishiming.net/thread-6519-1-1.html apache 自定义header  http://www.aminglinux.com/bbs/thread-830-1-1.html apache的keepalive和keepalivetimeout http://www.aminglinux.com/bbs/thread-556-1-1.html 1. 更改虚拟主机配置文件:网站设定防盗链(非白名单网站不可引用): 给11

python入门(11)条件判断和循环

python入门(11)条件判断和循环 条件判断 计算机之所以能做很多自动化的任务,因为它可以自己做条件判断. 比如,输入用户年龄,根据年龄打印不同的内容,在Python程序中,用if语句实现: age = 20 if age >= 18: print 'your age is', age print 'adult' 根据Python的缩进规则,如果if语句判断是True,就把缩进的两行print语句执行了,否则,什么也不做. 也可以给if添加一个else语句,意思是,如果if判断是False,

补码运算溢出判断方法

溢出判断方法一 用Xf和Yf表示被加数和加数补码的符号位,Zf为补码和的符号位.当出现Xf = Yf= 0两数同为正,而Zf为负,即Zf=1时,有上溢.当出现Xf =Yf = 1两数同为负,而Zf为正,即Zf= 0时,有下溢. 溢出判断方法二 当数值最高位有进位位C1=1,符号位没有进位C0=0时,或当数值最高位没有进位位C1=0,符号位有进位C0=1时,结果有溢出. 溢出判断方法三: 用变形补码进行双符号位运算.在变形补码中,正数符号以"00"表示,负数的符号以"11&qu

11.25 配置防盗链11.26 访问控制Directory11.27 访问控制FilesMatch

11.25 配置防盗链vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf检查与加载配置文件测试在浏览打开图片站点提示错误这时候在第三方站点(ask.apelearn.com)发布超链接,将第三方站点加入白名单就可以访问了点击超链接就可以打开网站图片了再模拟成111.com就状态码变成200注意referer不能随便写一定要写成http://11.26 访问控制Directory这种访问控制是用目录来做的vim /usr/local/apac

人脸识别活体检测技术讨论:基于背景人脸相对运动的活体判断方法

活体检测是人脸识别安全性的重要保障,是人脸识别厂商将产品普及应用于各行业的重要竞争力.目前活体判断的方法很多,但很难基于一种方法就能达到理想的效果,往往需要多种算法的交叉判断,本文主要介绍一种简单有效的活体判断方法.在很多情况下,高清照片和真人在某些光线条件下在相机中的成像很接近,这就导致仅仅基于面部的特征很难准确判断活体.在大部分场景下,人手拿着照片,手机或者pad不会完全静止不动,而在有运动时,真人和照片的区别很大:真实人脸运动与背景无相关性,照片,手机或者Pad在运动时,人脸运动与周围背景

计算几何凸多边形判断方法(未完)

凸多边形 凸多边形的判断方法: 1)角度法: 判断每个顶点所对应的内角是否小于180度,如果小于180度,则是凸的,如果大于180度,则是凹多边形. 2)凸包法: 这种方法首先计算这个多边形的凸包,关于凸包的定义在此不再赘述,首先可以肯定的是凸包肯定是一个凸多边形.如果计算出来的凸多边形和原始多边形的点数一样多,那就说明此多边形时凸多边形,否则就是凹多边形. 3)顶点凹凸性法 利用以当前顶点为中心的矢量叉乘或者计算三角形的有符号面积判断多边形的方向以及当前顶点的凹凸性. 假设当前连续的三个顶点分

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

package com.hanqi.lianxi; import java.util.Scanner; public class startWith { //自己写一个与startWith类似的判断方法 public static void main(String[] args) { //首先随便定义一个字符串如下 String str = "fghkldrt"; //提示我们自己输入一个字符串,用来判断输入的字符串是不是刚刚定义的字符串的开头 Scanner sc = new Sca

判断方法执行是否超时方法

#region 判断方法执行是否超时 /// <summary> /// 判断方法是否超时,适合无参数方法 /// </summary> /// <param name="action">方法名称</param> /// <param name="timeoutMilliseconds">超时时间限定</param> private void CallWithTimeout(Action act