問題描述:
目標是創建一個泛型函數,擴展 Enum.Parse
的功能,允許在找不到匹配的枚舉值時指定默認值。該函數也應該不區分大小寫。
然而,當嘗試使用以下代碼定義函數時:
<code class="language-csharp">public static T GetEnumFromString<T>(string value, T defaultValue) where T : Enum { // 实现... }</code>
會遇到一個錯誤,指出約束不能是特殊類(System.Enum)。
解決方案:
為了解決此錯誤並允許使用泛型枚舉,可以將約束脩改為:
<code class="language-csharp">public static T GetEnumFromString<T>(string value, T defaultValue) where T : struct, IConvertible</code>
此更新後的約束確保 T 是一個結構體,並且也支持 IConvertible 接口,該接口由枚舉實現。
改進後的實現:
以下修改後的代碼演示了改進後的實現:
<code class="language-csharp">public static class EnumUtils { public static T ParseEnum<T>(string value, T defaultValue) where T : struct, IConvertible { if (!typeof(T).IsEnum) { throw new ArgumentException("T must be an enumerated type"); } if (string.IsNullOrEmpty(value)) { return defaultValue; } foreach (T item in Enum.GetValues(typeof(T))) { if (item.ToString().ToLowerInvariant().Equals(value.Trim().ToLowerInvariant())) { return item; } } return defaultValue; } }</code>
此方法現在接受泛型枚舉類型,並且是完全類型安全的,確保只返回有效的枚舉值。 ToLowerInvariant()
的使用保證了跨文化的正確性。
以上是如何在C#中安全解析具有默認值的枚舉字符串?的詳細內容。更多資訊請關注PHP中文網其他相關文章!