在 ASP.NET Web Forms 開發中,有時需要根據字符串 ID 動態查找頁面上的控件並進行操作(如設置屬性、綁定事件等)。傳統的 FindControl 方法需要從命名容器中遞歸查找,若控件層級較深或動態生成,寫法會較繁瑣。利用反射機制可以直接通過字段名獲取控件實例,代碼更簡潔。
///
/// 根據控件 ID 獲取控件實例
///
/// 控件的 ID 名稱
/// 找到的 Control 實例,未找到則拋出異常
private Control GetControl(string name)
{
// 使用反射獲取當前頁面類中定義的非公共實例字段(忽略大小寫)
object o = this.GetType().GetField(name,
System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Instance |
System.Reflection.BindingFlags.IgnoreCase).GetValue(this);
return (Control)o;
}
// 假設頁面上有一個 ID 為 "txtUserName" 的 TextBox
TextBox txt = (TextBox)GetControl("txtUserName");
txt.Text = "動態設置的值";
txt.Enabled = false;
FindControl 遞歸查找。FieldInfo 或改用其他方式。這個技巧在動態生成界面、通用控件操作封裝等場景下非常實用,能顯著減少樣板代碼。