2016-02-12 97 views
2

有没有办法覆盖第三方库中的私有方法?覆盖第三方库的私有方法

,比如我有像这样一类:

// Decompiled source 
public class Calculator{ 
    protected override Status Execute(){ 
     this.Calculate(); 
     ... 
     return Status.Ok; 
    } 

    private int Calcualte(){ 
     // need to overwrite this method 
    } 
} 

有没有办法覆盖计算()方法?

原因: 内计算()方法,我需要修改一些逻辑

+4

你可以,但它是一个真正的PITA(它可能会涉及[IL重写](http://www.mono-project.com/docs/tools+libraries/libraries/Mono.Cecil/faq /))。你确定你确实需要这样做吗?这听起来像一个[XY问题](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem),可能有一个更简单的方法来实现相同的最终目标。也许可以解释你想要做什么,覆盖私人方法是解决这个问题的方法吗? –

+0

重复:http://stackoverflow.com/questions/1451787/overriding-a-private-method-with-reflection – devundef

+0

你误会了我的观点。你在做什么,需要你修改逻辑'Calculate()'?也许你可以创建派生类,也许你可以创建自己的文件版本,如果你不告诉我们你想做什么,我们不知道你可以做什么。假设这个问题的答案是“你不能这样做,你需要找到别的东西”,在你的下一个问题的主体中加入你想写的内容:“我正在努力做,但不能编辑第三方课堂,我应该接下来要做什么?“作为对这个问题的编辑。 –

回答

5

没有,有在C#中没有办法。私人方法仅在该类中可用。当某些东西被定义为私人时,这是因为该类是内部的。你可以做的是:

1)创建一个扩展Calculator类的类。

2)覆盖执行方法并重用Calculator类中的部分代码。

+2

我几乎想给你一个绝对的陈述“不,没有办法”。您可以使用像[Mono.Cecil](http://www.mono-project.com/docs/tools+libraries/libraries/Mono.Cecil/faq/)这样的库来重写IL,但这不是一件容易的事情要做的事情,并导致脆弱的代码。 –

+4

我的意思是,你不能用C#做,你可以做IL重写,或者你可以得到源代码并改变它。对我而言,如果有人问“我可以重写一个私人方法吗?”答案是“不,你不能,你不应该考虑这样做”。当某些东西被定义为私人时,这是因为它是该类的内部。 –