在 C# 中,枚舉通常使用數值來表示不同的選項。但是,在某些情況下,您可能更傾向於將有意義的字符串與這些選項關聯起來。
一種方法是使用自定義屬性和字符串檢索方法:
<code class="language-csharp">[StringValue("FORMS")] public enum AuthenticationMethod { FORMS = 1, WINDOWSAUTHENTICATION = 2, SINGLESIGNON = 3 } public static class StringEnum { public static string GetStringValue(Enum value) { // 检索 StringValue 属性,如果找到则返回关联的字符串;否则返回 null。 } }</code>
此方法需要手動應用屬性,並且被認為比較冗長。
另一種方法是考慮類型安全的枚舉模式:
<code class="language-csharp">public sealed class AuthenticationMethod { private readonly string name; private readonly int value; public static readonly AuthenticationMethod FORMS = new AuthenticationMethod(1, "FORMS"); public static readonly AuthenticationMethod WINDOWSAUTHENTICATION = new AuthenticationMethod(2, "WINDOWS"); public static readonly AuthenticationMethod SINGLESIGNON = new AuthenticationMethod(3, "SSN"); private AuthenticationMethod(int value, string name) { this.name = name; this.value = value; } public override string ToString() { return name; } }</code>
此模式涉及創建一個類似於枚舉的密封類,其中靜態只讀字段表示每個選項。每個字段都具有字符串表示形式(name)和數值(value)。
對於顯式類型轉換,請考慮添加映射字典和用戶定義的類型轉換運算符:
<code class="language-csharp">private static readonly Dictionary<string, AuthenticationMethod> instance = new Dictionary<string, AuthenticationMethod>(); public AuthenticationMethod(int value, string name) { instance[name] = this; } public static explicit operator AuthenticationMethod(string str) { if (instance.TryGetValue(str, out AuthenticationMethod result)) return result; else throw new InvalidCastException(); }</code>
這種方法結合了兩種方法的優點:類型安全、方便的字符串表示和用戶定義的類型轉換。
以上是如何有效地表示C#枚舉中的字符串?的詳細內容。更多資訊請關注PHP中文網其他相關文章!