.NET Framework 內部許多實用方法標記為 internal 或 private,無法直接呼叫。透過反射搭配 BindingFlags 可繞過可見性限制。本文實戰示範呼叫 Page.DecryptString 解密 __PREVIOUSPAGE 隱藏欄位,驗證跨頁回傳邏輯分析。
protected void Button2_Click(object sender, EventArgs e)
{
// 目標型別
Type t = typeof(System.Web.UI.Page);
// 參數陣列:加密字串
object[] args = new object[] { "Htr9cH0-sPEsru8HSXo70y6PnBg8nwjl0" };
// 綁定旗標:非公用、靜態/實例、宣告於此型別、呼叫方法
BindingFlags flags = BindingFlags.DeclaredOnly
| BindingFlags.Static
| BindingFlags.NonPublic
| BindingFlags.InvokeMethod
| BindingFlags.Instance;
// 呼叫內部靜態方法 DecryptString
string decrypted = (string)t.InvokeMember("DecryptString", flags, null, this, args);
Response.Write("<br/>" + decrypted + "<br/>");
}
| 旗標 | 作用 |
|---|---|
NonPublic | 包含非公用成員(private/protected/internal) |
Static / Instance | 指定靜態或實例成員(此處兩者皆設,涵蓋所有) |
DeclaredOnly | 僅搜尋型別直接宣告的成員,不含繼承鏈 |
InvokeMethod | 指定動作為呼叫方法 |
InvokeMember 參數:方法名、綁定旗標、Binder(null 用預設)、目標物件(靜態方法傳 null 或型別實例)、參數陣列。
MethodInfo 重複使用。private static readonly MethodInfo _decryptMethod =
typeof(Page).GetMethod("DecryptString",
BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.DeclaredOnly);
public static string DecryptViewState(string encrypted)
{
return (string)_decryptMethod.Invoke(null, new object[] { encrypted });
}
反射呼叫非公用方法是「核子選項」,威力大但風險高。適用於除錯、測試、框架擴充等非核心業務場景。生產代碼應優先尋找公用 API 替代方案,或封裝為可替換的適配器隔離變更風險。