獨資例如起見,我已經寫了這一點:更改訪問修飾符在運行時
public class MyClass
{
private int MyMethod()
{
return 1;
}
}
有使用反射或東西來改變在運行時MyClass::MyMethod()
訪問修飾符來公共任何方式其他,然後調用它?
獨資例如起見,我已經寫了這一點:更改訪問修飾符在運行時
public class MyClass
{
private int MyMethod()
{
return 1;
}
}
有使用反射或東西來改變在運行時MyClass::MyMethod()
訪問修飾符來公共任何方式其他,然後調用它?
不能確定是否可以修改訪問說明符,但你可以通過像反射調用私有方法:
MyClass instance = new MyClass();
MethodInfo yourMethod = instance
.GetType()
.GetMethod("MyMethod", BindingFlags.NonPublic | BindingFlags.Instance);
var returnValue = yourMethod.Invoke(instance, new object[] { });
Console.WriteLine(returnValue);
非常感謝,它工作。你能解釋爲什麼你使用'BindingFlags.Instance'嗎? – Netherwire
@RomanChehowsky,它的一個實例方法,嘗試一個私有靜態方法,然後使用'BindingFlags.Static' – Habib
再次感謝,但我已經回答了這個問題:) – Netherwire
不,一類是它是什麼,你不能在運行時改變它。
您可以創建一個擁有成員的新類,但MyMethod
會公開,但它不會再是同一個類。
在任何情況下,我想不出任何情況下做這樣的事情會有什麼意義。
你說得對,它似乎沒有意義,但我想知道如何處理這個。 – Netherwire
我有一個有意義的用途,這是有道理的。我在EF6中生成了一個DbContext,並使用單例類來包裝它。現在我希望人們只能訪問我的單例包裝器,而不是生成的DbContext類(因爲它是以public方式生成的)。我希望能夠在運行時使其成爲內部的,以便其他程序集必須使用我的包裝。現在,我正在做的是每次刷新代碼的EF部分以覆蓋公共訪問修改器時手動更改它。 –
很確定您可以使用反射來調用方法,而不必使用'MethodInfo.Invoke'方法更改訪問修飾符。 –