回答
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. Boost.Variant与虚拟接口性能
- 16. 虚拟方法
- 17. Stm32虚拟COM端口 - 无法连接
- 18. 为什么我的虚拟方法没有被覆盖?
- 19. 使方法变为虚拟的危险是什么?
- 20. 为什么接口不能有静态成员方法
- 21. 为什么java接口不能包含静态方法实现?
- 22. 为什么不能公开一个实现的接口方法?
- 23. 为什么泛型方法不能用于继承和接口?
- 24. 将方法/属性标记为虚拟的性能影响是什么?
- 25. 为什么整数除法只截取python中的正分子?
- 26. SO_BINDTODEVICE虚拟接口失败
- 27. 虚拟接口Dtor && Dynamic_Cast
- 28. 虚拟集合的接口
- 29. 为什么接口或抽象类有用? (或为什么?)
- 30. 为什么我不能在Windsor注册多个接口的一个类?
我对这项技术也很陌生。刚刚陷入这个错误,并没有使虚拟方法成为现实。 – 2012-04-24 14:41:47