2013-02-07 167 views
1

我想持續組合框的當前選定值並在稍後恢復它。要管理組合框中的值,我有一個帶有描述屬性的枚舉類型。描述屬性在運行時變爲(其中之一)組合框字符串值,並且與其關聯的枚舉常量在內部用於編程目的。我從下面的堆棧溢出後此技術:在C#中將字符串轉換爲枚舉類型?

c#:How to use enum for storing string constants?

該職位包含在評論該博客文章的一個鏈接:

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屬性關聯的枚舉值。假設的方法聲明是:

public static Enum GetEnumValue(string str){} 

但是,該聲明的直接問題是它不返回特定的枚舉類型。我不知道如何正確聲明和投射東西,以便返回正確的枚舉類型。是否有可能爲GetDescription()方法創建這種補充方法,如果有,我該如何製作它,以便它適用於任何特定的枚舉類型?如果我可以做到這一點,我將爲用於持久控制設置的字符串之間轉換的常見問題提供一個方便的解決方案,然後稍後恢復它們,所有這些都由枚舉支持。

回答

3

您錯過了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,將自己的工作保存在主叫方。

編輯:

增加了粗糙例如,未經測試。

+0

這就是我一直在尋找的想法(泛型)。如果你非常喜歡並且可以充實一點代碼片段來展示一個具體的例子,我會很感激。 –

+0

@RobertOschler:增加了一些粗糙的東西,甚至沒有檢查它是否編譯,更不用說工作了,但它似乎是你正在尋找的東西。 – Guvante

+1

和其他人閱讀此。如果無法找到屬性描述,則返回值的返回語句無效。它將觸發異常,因爲typeof(TEnum)返回NULL,並導致Enum.Parse()失敗。相反,如果使用給定的字符串找不到屬性,我會在代碼的該位置返回一個異常。除此之外,它很好,謝謝。 –

相關問題