首頁 >後端開發 >C++ >如何在C#中安全解析具有默認值的枚舉字符串?

如何在C#中安全解析具有默認值的枚舉字符串?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-02-01 06:01:09958瀏覽

How to Safely Parse Enum Strings with a Default Value in C#?

泛型方法與枚舉類型約束

問題描述:

目標是創建一個泛型函數,擴展 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn