c# - 如何让委托(delegate)引用方法的特定版本?

标签 c# delegates overriding

我想创建一个调用特定实例方法的委托(delegate),不幸的是,如果该方法是虚拟的,似乎将调用继承类的方法覆盖而不是基版本。

    public class Base{
        public virtual void Method(){
            Console.WriteLine("Base");
        }
    }

    public class Child : Base{
        public override void Method(){
            Console.WriteLine("Child");
        }
    }

如果在代码的其他地方我有以下::

var action = Delegate.CreateDelegate(typeof(Action<Base>), typeof(Base).GetMethod("Method")) as Action<Base>;
action(new Child());

这个程序的输出是Child。我非常希望它成为 Base。我用表达式树尝试了同样的事情,我得到了相同的结果,因为发出的 IL 使用 callvirt 方法。真的只有使用 Reflection.Emit 才能做到这一点吗?

我问的原因是我正在使用类型构建器来覆盖类的行为。如果我自己编写该方法,我可以直接使用 base.Method() 或其他任何方式,但是,某些方法行为只能在运行时动态确定,因为要考虑到许多可能的情况会很乏味。

由于我正在创建一个在运行时派生自 Base 的类,如果我尝试在 Method() 中调用 Method() > 我正在使它过载导致无限递归和堆栈溢出异常。 (不太好)。

这是一个 AOP 风格的项目,我在运行时向方法添加一些逻辑。我用属性标记方法,然后我有一个类型构建器创建 methodBuilder 使用 CompileToMethod(methodbuilder) http://msdn.microsoft.com/en-us/library/dd728224.aspx 为方法构建器的主体提供表达式树, 这比 reflection.emit 容易得多,因为我添加的逻辑非常重要。目标是让工厂生成一个新类,每当我调用 Method() 时,它都会先执行一些逻辑,然后再最终调用基本实现。

最佳答案

是的,Reflection.Emit 是.NET 框架提供的实现方法重载的唯一方式。由于在重载方法时不使用其他 API,因此它们不提供任何链接到基本实现的方法。

关于c# - 如何让委托(delegate)引用方法的特定版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4173567/

相关文章:

C#/LINQ : Trying to optimize performance

c# - 方法重载和空值

c++ - 如何自动更新重写方法的 *this 返回类型?

java - Java 中的静态和覆盖

P 的 Java toString() 重写

c# - 丰富的卡片属性 Markdown 格式化

c# - 仅当目标对象在 Automapper 中没有值时如何映射

ios - 为什么使用协议(protocol),而不是直接调用方法?

c# - 委托(delegate)部分不在 MMO 的客户端运行

c# - Delegate.CreateDelegate 与 DynamicMethod 与表达式