利用反射與約定優於配置,實現實體對象與 UI 控件雙向綁定,進而將驗證、業務邏輯封裝於 Controller 類,實現 UI 與後台邏輯解耦。
class Controller
{
private readonly Form _view;
private readonly User _user = new User();
public Controller(Form view) => _view = view;
// 從 UI 收集數據到實體
public bool IsValidated()
{
ControlHelper.GetControlsValues(_view, _user); // 反射賦值
return !string.IsNullOrEmpty(_user.Name) && !string.IsNullOrEmpty(_user.Pwd);
}
// 業務邏輯
public bool Login()
{
if (!IsValidated()) return false;
return AuthService.Login(_user.Name, _user.Pwd);
}
// 將結果回填 UI
public void ShowResult(bool success)
{
ControlHelper.SetControlValue(_view, "lblMsg", success ? "登錄成功" : "失敗");
}
}
// Form 中
private Controller _ctrl;
public Form1()
{
InitializeComponent();
_ctrl = new Controller(this);
}
private void BtnLogin_Click(object sender, EventArgs e)
{
if (_ctrl.Login()) _ctrl.ShowResult(true);
else _ctrl.ShowResult(false);
}
// 為所有 TextBox 設置紅色邊框
ControlHelper.ApplyStyle(_view, c => c is TextBox, c => ((TextBox)c).BorderStyle = BorderStyle.FixedSingle);
// 清空所有 TextBox
ControlHelper.ClearControls(_view, c => c is TextBox);
IControl)。txtName 對應 Name)消除大量樣板代碼。IControl。ControlHelper 實現獲取/設置/驗證/樣式/清空。