C# 列舉底層型別僅支援整數類型(byte、int、long 等),不支援 string。但實務上常需「具名常數」對應「字串值」(如顏色十六進位代碼 "#FF0000")。
核心技巧:
private 建構子防止外部實例化。public static readonly 欄位暴露預定義實例。explicit operator string / explicit operator Color 實現雙向轉換。==/Equals。public sealed class Color
{
private readonly string _value;
private Color(string value) => _value = value;
// 預定義實例
public static readonly Color Red = new Color("#FF0000");
public static readonly Color Green = new Color("#00FF00");
public static readonly Color Blue = new Color("#0000FF");
// 實例 → 字串
public static explicit operator string(Color c) => c._value;
// 字串 → 實例(嚴格驗證)
public static explicit operator Color(string hex)
{
return hex switch
{
"#FF0000" => Red,
"#00FF00" => Green,
"#0000FF" => Blue,
_ => throw new InvalidCastException($"無效色碼: {hex}")
};
}
public override string ToString() => _value;
}
Color c1 = Color.Red;
string hex = (string)c1; // "#FF0000"
Color c2 = (Color)"#00FF00"; // Color.Green
Debug.Assert(c2 == Color.Green); // 參考相等,直接比較
此模式同時承擔「列舉標識」與「資料載體」雙重責任:
框架以三個類型分工合作,完美遵循 SRP:
| 類型 | 職責 | 關鍵成員 |
|---|---|---|
| KnownColor (enum) | 具名顏色標識(系統色、Web 色) | Red, Desktop, ControlText... |
| Color (struct) | 色彩資料載體(ARGB 通道) | A/R/G/B 屬性, FromKnownColor(), ToKnownColor(), 運算子多載 |
| ColorTranslator (class) | 色彩與 HTML/Win32/OLE 格式互轉 | ToHtml(), FromHtml(), ToWin32(), ToOle() |
using System.Drawing;
// 取得系統桌面背景色的 HTML 色碼
string desktopHtmlColor = ColorTranslator.ToHtml(
Color.FromKnownColor(KnownColor.Desktop)
);
// 從 HTML 色碼建立 Color 結構
Color myColor = ColorTranslator.FromHtml("#336699");
byte alpha = myColor.A; // 255
byte red = myColor.R; // 51
sealed class 模擬列舉即可,開發快速。System.Drawing 三件組,架構乾淨、功能完整、效能優異。