zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    七种数据类型
    js字符串解析成数字
    html节点操作与事件
    form表单的默认提交行为
    CSS中的各种width(宽度)
    Javascript读写CSS属性
    ECMAScript6新特性之Reflect
    ECMAScript6新特性之String API
    ECMAScript6新特性之Array API
    判断Javascript对象是否为空
  • 原文地址:https://www.cnblogs.com/lindexi/p/12085455.html
Copyright © 2011-2022 走看看