是否可以通过在.NET 3.5中使用Reflection来覆盖私有方法?
答案 0 :(得分:7)
嗯,需要virtual
才能覆盖它(通过编写一个继承自该类的动态类型),并且你不能拥有private virtual
(它不会感)。您可以覆盖internal virtual
,但我怀疑这可能会遇到安全问题。所以最终,我会说不。
答案 1 :(得分:5)
不单独使用Reflection。也许您可以做的最好的事情是使用Reflection,结合Reflection.Emit或CodeDom将类复制到新的命名空间中。当您遇到要替换的私有方法时,不要复制它,而是放弃替换。
然而,开发人员可以使用许多技术使这项技术变得更加困难。将类的实现分解为许多私有或内部类就是这样的。
注意:使用CodeDom,您必须在内存中构建图形,编译它,然后加载生成的程序集。
这可能比它值得多麻烦。
另一种方法是使用Reflector反汇编类,使用方法replace来获取代码并从中构建自己的类。同样需要克服重大的技术和法律障碍。您可以从反汇编的代码中学到很多东西。
答案 2 :(得分:1)
不使用反射。你需要使用某种AOP。
答案 3 :(得分:1)
Typemock Isolator应该能够做到这一点,但是通过.NET探查器API(根据{Osterove在The Art of Unit Testing中的说法)这样做。