2016-02-12 76 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重寫,或者你可以得到源代碼並改變它。對我而言,如果有人問「我可以重寫一個私人方法嗎?」答案是「不,你不能,你不應該考慮這樣做」。當某些東西被定義爲私人時,這是因爲它是該類的內部。 –