首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# ToString() 如何一次返回多個屬性值?委託模式靈活應對 ComboBox 顯示需求

     編輯:程式設計綜合問答

場景痛點:ComboBox 需要不同顯示格式

類別 Client 有三個屬性:clientCode、clientName、abbreviation。開發者希望在同一個類別中,根據不同 ComboBox 的綁定需求,分別顯示不同的字串組合(如「代碼-名稱」、「僅名稱」等),但 ToString() 只能有一個實作,無法直接滿足多樣化顯示。

錯誤嘗試:直接返回多值(編譯不通過)

public override string ToString() {
    return clientCode, clientName, contacts; // CS1002: ; expected / 錯誤語法
}

進階解法:引入 Func<T, string> 委託作為顯示策略

public class Client {
    public string ClientCode { get; set; }
    public string ClientName { get; set; }
    public string Abbreviation { get; set; }

    // 預設顯示策略:代碼,名稱,縮寫
    public Func<Client, string> DisplaySelector = c => 
        $"{c.ClientCode},{c.ClientName},{c.Abbreviation}";

    public override string ToString() => DisplaySelector(this);
}

使用範例:針對不同 ComboBox 動態切換顯示格式

var client = new Client { 
    ClientCode = "C001", 
    ClientName = "張三", 
    Abbreviation = "ZS" 
};

// ComboBox1:顯示完整資訊(預設)
comboBox1.Items.Add(client); // 輸出:C001,張三,ZS

// ComboBox2:僅顯示名稱
client.DisplaySelector = c => c.ClientName;
comboBox2.Items.Add(client); // 輸出:張三

// ComboBox3:自訂格式「代碼-縮寫」
client.DisplaySelector = c => $"{c.ClientCode}-{c.Abbreviation}";
comboBox3.Items.Add(client); // 輸出:C001-ZS

設計優勢

  • 單一類別,多重視圖:無需建立多個相同內容的子類別或 DTO。
  • 運行時可變:隨時替換 DisplaySelector 即時生效,支援動態 UI 需求。
  • 符合開放封閉原則:新增顯示格式只需新增 Lambda,不修改類別核心邏輯。
  • 相容性佳:ToString() 仍保留標準行為,不影響序列化、日誌等其他場景。

替代方案對比

方案優點缺點
重寫 ToString 固定格式簡單無法適配多種顯示需求
建立多個 ViewModel/DTO關注點分離類別爆炸,維護成本高
實作 IFormattable標準化格式化ComboBox 不自動調用 ToString(format, provider)
委託策略模式(推薦)靈活、零侵入、運行時可變需注意委託為 null 時的預設處理

最佳實踐: 在建構子中初始化 DisplaySelector 為預設值,避免 NullReferenceException;若專案使用 MVVM,建議將顯示邏輯移至 ViewModel 的 DisplayText 屬性,讓 View 純粹綁定。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved