回答
C#语言在这里完全不相关。问题是拦截在运行时级别如何工作。
一种技术是继承类/实现接口并将其用作代理。这显然只能覆盖虚拟方法和接口方法。我怀疑Windsor使用这种技术。这种技术的优点是它不需要任何特殊的东西。只需在运行时创建一个类。
另一种方法是使用分析API。这允许您修改任何方法的IL,包括非虚拟方法。这更具侵入性,通常只在测试遗留代码时才使用。
另一种方法是在构建时使用IL重写。这可以在您编写的代码中添加拦截点,但不会在框架代码中添加拦截点。
既没有也没有。 Windsor通过子类工作,并且只能合理地覆盖虚拟方法 - 或者可以实现接口。
其他任何事情都需要调试器/探查器挂钩处于活动状态,这很难做 - 有些嘲讽框架支持,尽管它们都不是免费的。
我认为微软鼹鼠是免费的,可以做到这一点。但我自己并没有尝试过。 – CodesInChaos 2012-04-24 14:51:34
痣已退休。它现在被称为“Fakes”,是Visual Studio 11的一部分;)http://research.microsoft.com/en-us/projects/moles/ – TomTom 2012-04-25 17:36:52
是的,你需要虚拟的,但这只是因为微软已经搞砸了这种行为,如果你看Java的方法默认情况下打开扩展,你必须明确标记为密封。
阅读更多关于SOLID原则,特别是Open Closed Principle。
-1。那么如何在Java中对selaed方法进行子类化?停止宗教战争 - 在测试模拟密封方法和良好框架支持这一点时,有很好的理由。 – TomTom 2012-01-09 07:05:12
TomTom并不是一件宗教性的事情,如果它支持代码编织,所有的代码都会很棒,我只是表示,如果你不想,可以在你的代码中遵循开放的封闭原则,这是一个很好的习惯。我的客人:) – Nexus 2012-01-09 09:53:14
当然。只是为了方便单元测试而违反项目要求(封闭的API),这是严格嘲讽框架的限制。好的甚至可以用另一个类替换一个类中的NEW构造。 – TomTom 2012-01-09 11:44:54
- 1. 有很多虚拟方法的接口?或者只有一个虚拟方法有很多接口?
- 2. 为什么C#接口方法未声明为抽象或虚拟?
- 3. 为什么在实现接口方法时允许虚拟?
- 4. 接口,抽象,或只是虚拟的方法?
- 5. 为什么不能将这种虚拟方法内联?
- 6. 为什么这种纯虚拟方法不能编译?
- 7. 为什么虚拟表只有在虚拟功能的情况下才需要?
- 8. 为什么此方法在未标记为虚拟时表现为虚拟?
- 9. 带空虚的虚拟方法和纯虚拟方法有什么区别?
- 10. 静态方法不能实现接口方法,为什么?
- 11. 为什么使用虚拟功能?
- 12. 为什么虚拟功能会隐藏?
- 13. 为什么我只能有一个虚拟主机?
- 14. 为什么虚方法
- 15. 如何截取虚拟机窗口的截图?
- 16. 为什么方法表只包含基类的虚方法?
- 17. 为什么接口方法范围只公开?
- 18. 非虚拟接口 - 如何调用正确的虚拟功能
- 19. 为什么编译器为非虚拟方法发出callvirt?
- 20. RandomAccess接口,为什么没有方法?
- 21. 为什么接口默认方法?
- 22. Boost.Variant与虚拟接口性能
- 23. 虚拟方法
- 24. Stm32虚拟COM端口 - 无法连接
- 25. 为什么NHibernate要求实体方法是虚拟的?
- 26. 为什么调用这个虚拟方法?
- 27. 使方法变为虚拟的危险是什么?
- 28. 为什么我的虚拟方法没有被覆盖?
- 29. 非虚拟方法和密封方法有什么区别?
- 30. 为什么接口方法不能是“静态”和“最终”?
我对这项技术也很陌生。刚刚陷入这个错误,并没有使虚拟方法成为现实。 – 2012-04-24 14:41:47