我想创建一个调用特定实例方法的委托,遗憾的是,如果该方法是虚拟的,则将调用继承类的方法的重写而不是基本版本.
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样式项目,我在运行时向方法添加一些逻辑.我使用属性标记方法,然后我有一个类型构建器,使用CompileToMethod(methodbuilder)http://msdn.microsoft.com/en-us/library/dd728224.aspx创建methodBuilders,为表达式树提供方法构建器的主体,
这比反射更简单.因为逻辑是非平凡的,我正在添加.我的目标是,我有一个工厂吐出一个新类,每当我调用Method()时,它会在最终调用基础实现之前先做一些逻辑.
最佳答案 是的,Reflection.Emit是.NET框架提供的实现方法重载的唯一方法.由于在重载方法时不使用其他API,因此它们不提供链接到基本实现的任何方法.