2013-10-11 37 views
1

獨資例如起見,我已經寫了這一點:更改訪問修飾符在運行時

public class MyClass 
{ 
    private int MyMethod() 
    { 
     return 1; 
    } 
} 

使用反射或東西來改變在運行時MyClass::MyMethod()訪問修飾符來公共任何方式其他,然後調用它?

+0

很確定您可以使用反射來調用方法,而不必使用'MethodInfo.Invoke'方法更改訪問修飾符。 –

回答

5

不能確定是否可以修改訪問說明符,但你可以通過像反射調用私有方法:

MyClass instance = new MyClass(); 
MethodInfo yourMethod = instance 
          .GetType() 
          .GetMethod("MyMethod", BindingFlags.NonPublic | BindingFlags.Instance); 
var returnValue = yourMethod.Invoke(instance, new object[] { }); 
Console.WriteLine(returnValue); 
+0

非常感謝,它工作。你能解釋爲什麼你使用'BindingFlags.Instance'嗎? – Netherwire

+1

@RomanChehowsky,它的一個實例方法,嘗試一個私有靜態方法,然後使用'BindingFlags.Static' – Habib

+0

再次感謝,但我已經回答了這個問題:) – Netherwire

1

不,一類是它是什麼,你不能在運行時改變它。

您可以創建一個擁有成員的新類,但MyMethod會公開,但它不會再是同一個類。

在任何情況下,我想不出任何情況下做這樣的事情會有什麼意義。

+0

你說得對,它似乎沒有意義,但我想知道如何處理這個。 – Netherwire

+0

我有一個有意義的用途,這是有道理的。我在EF6中生成了一個DbContext,並使用單例類來包裝它。現在我希望人們只能訪問我的單例包裝器,而不是生成的DbContext類(因爲它是以public方式生成的)。我希望能夠在運行時使其成爲內部的,以便其他程序集必須使用我的包裝。現在,我正在做的是每次刷新代碼的EF部分以覆蓋公共訪問修改器時手動更改它。 –