簡體   English   中英

在C#中將字符串轉換為枚舉類型?

[英]Converting strings to enumerated types in C#?

我想保留當前選定的組合框的值,並在以后恢復它。 要管理組合框中的值,我有一個帶有描述屬性的枚舉類型。 description屬性在運行時變為(一個)組合框字符串值,並且與其關聯的枚舉常量在內部用於編程目的。 我從以下Stack Overflow帖子中獲得了這種技術:

c#:如何使用枚舉來存儲字符串常量?

該帖子在此博客文章的評論中包含一個鏈接:

http://weblogs.asp.net/grantbarrington/archive/2009/01/19/enumhelper-getting-a-friendly-description-from-an-enum.aspx

執行枚舉到字符串轉換魔法的GetDescription()方法在此處從該帖子復制,並在參數列表中添加“this”關鍵字,因此我可以將其用作具有枚舉類型的擴展方法:

    public static string GetDescription(this Enum en)
    {
        Type type = en.GetType();

        MemberInfo[] memInfo = type.GetMember(en.ToString());

        if (memInfo != null && memInfo.Length > 0)
        {
            object[] attrs = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);

            if (attrs != null && attrs.Length > 0)
            {
                return ((DescriptionAttribute)attrs[0]).Description;
            }
        }

        // Unable to find a description attribute for the enum.  Just return the
        //  value of the ToString() method.
        return en.ToString();
    }

因此,我將方程式的一面完全充實,並且它的效果非常好。 現在我想走另一條路。 我想創建一個方法,該方法接受一個字符串並通過遍歷特定枚舉類型的description屬性返回正確的枚舉值,並返回與該字符串匹配的description屬性關聯的枚舉值。 假設的方法聲明將是:

public static Enum GetEnumValue(string str){}

然而,該聲明的直接問題是它不返回特定的枚舉類型。 我不確定如何正確聲明和轉換,以便返回正確的枚舉類型。 是否可以為GetDescription()方法創建這種補充方法,如果是這樣,我如何制作它以便它可以方便地用於任何特定的枚舉類型? 如果我能做到這一點,我將有一個方便的解決方案,解決在用於持久控制設置的字符串之間進行轉換然后在以后恢復它們的常見問題,所有這些都由枚舉支持。

你錯過了一條信息,Enum要看什么。

目前,您只傳入一個字符串,但不傳遞Enum的類型。

最簡單的方法是使用通用函數

請注意,這個內容不在袖口,可能甚至不編譯。

public static TEnum GetEnumValue<TEnum>(string str)
    where TEnum : struct //enum is not valid here, unfortunately
{
    foreach (MemberInfo memInfo in typeof(TEnum).GetMembers())
    {
        object[] attrs = memInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);

        if (attrs != null && attrs.Length > 0)
        {
            if (((DescriptionAttribute)attrs[0]).Description == str)
            {
                return (TEnum)(object)Enum.Parse(typeof(TEnum),memInfo.Name);
            }
        }
    }

    // Unable to find a description attribute for the enum.
    return (TEnum)(object)Enum.Parse(typeof(TEnum),str);
}

然后,您可以使用typeof(TEnum)獲取所請求枚舉的類型對象並執行您的邏輯。

最后你可以在返回之前回到TEnum ,節省你自己在主叫方面的工作。

編輯:

添加了一個粗略的例子,未經測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM