優雅地獲取C#枚舉的字符串表示
考慮以下枚舉:
<code class="language-csharp">public enum AuthenticationMethod { FORMS = 1, WINDOWSAUTHENTICATION = 2, SINGLESIGNON = 3 }</code>
要獲取字符串值(例如“FORMS”而不是ID 1),需要自定義解決方案。雖然現有的基於屬性的方法和字典方法提供了變通方案,但存在更優雅的解決方案。
類型安全枚舉模式
類型安全枚舉模式引入一個密封類,將每個枚舉成員表示為單獨的實例:
<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>
這種模式具有以下優點:
AuthenticationMethod
類確保只使用有效值。 顯式類型轉換
如果需要,可以向AuthenticationMethod
類添加顯式類型轉換,允許進行字符串到枚舉的轉換(此部分代碼示例中存在問題,需要修正):
<code class="language-csharp">// 修正后的显式类型转换 private static readonly Dictionary<string, AuthenticationMethod> instance = new Dictionary<string, AuthenticationMethod>() { {"FORMS", FORMS}, {"WINDOWS", WINDOWSAUTHENTICATION}, {"SSN", SINGLESIGNON} }; public static explicit operator AuthenticationMethod(string str) { if (instance.TryGetValue(str, out var result)) return result; else throw new InvalidCastException(); }</code>
這允許方便地進行轉換,例如:
<code class="language-csharp">AuthenticationMethod method = (AuthenticationMethod)"FORMS";</code>
以上是如何更優雅地獲得C#中的枚舉的字符串表示?的詳細內容。更多資訊請關注PHP中文網其他相關文章!