我想创建一个调用特定实例方法的委托(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/