首页 / C# / c# – 如何让委托引用特定版本的方法?
c# – 如何让委托引用特定版本的方法?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 如何让委托引用特定版本的方法?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1402字,纯文字阅读大概需要3分钟。
内容图文
我想创建一个调用特定实例方法的委托,遗憾的是,如果该方法是虚拟的,则将调用继承类的方法的重写而不是基本版本.
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,因此它们不提供链接到基本实现的任何方法.
内容总结
以上是互联网集市为您收集整理的c# – 如何让委托引用特定版本的方法?全部内容,希望文章能够帮你解决c# – 如何让委托引用特定版本的方法?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。