2009-07-23 114 views
1

感謝this問題,我設法解決如何限制我的泛型方法只接受枚舉。如何在泛型方法中獲取枚舉的數據值?

現在我試圖創建一個通用的方法,以便我可以將下拉列表綁定到任何我選擇的枚舉上,在下拉列表中顯示描述,其值等於數字的值枚舉值。

public static object EnumToDataSource<T>() where T : struct, IConvertible { 
    if (!typeof(T).IsEnum) // just to be safe 
    throw new Exception(string.Format("Type {0} is not an enumeration.", typeof(T))); 
    var q = Enum.GetValues(typeof(T)).Cast<T>() 
    .Select(x => new { ID = DataUtil.ToByte(x), Description = x.ToString() }) // ToByte() is my own method for safely converting a value without throwing exceptions 
    .OrderBy(x => x.Description); 
    return q; 
} 

看起來不錯,但ToByte()總是返回0,即使我的枚舉值顯式設置,就像這樣:

public enum TStatus : byte { 
    Active = 1, 
    Inactive = 0, 
} 

以外的通用方法,如果我投TStatus類型的值到byte,它完美的作品。在通用方法中,如果我嘗試將類型爲T的東西轉換爲byte,則會出現編譯器錯誤。 我在Enum靜態接口中找不到任何東西來做到這一點。

那麼,如何才能獲得通用內部枚舉的數值? (我也會接受關於感激優化我的代碼的任何其他建議...)

編輯:呃,呃......原來,事情是行不通的 - 因爲是在一個錯誤我的ToByte()方法...(臉紅)。噢,謝謝 - 我從中學到了很多東西!

+0

Convert.ToByte()或Enum.Parse(typeof(T),tVal.ToString())應該可以正常工作。 – LBushkin 2009-07-23 14:52:26

回答

2

你可以做這樣的(變化DataUtil.ToByte(x)與x.ToByte(空)):

public static object EnumToDataSource<T>() where T : struct, IConvertible 
     { 
      if (!typeof (T).IsEnum) throw new Exception(string.Format("Type {0} is not an enumeration.", typeof (T))); 
      var q = 
       Enum.GetValues(typeof (T)).Cast<T>().Select(x => new {ID = x.ToByte(null), Description = x.ToString()}).OrderBy(
        x => x.Description).ToArray(); 
      return q; 
     } 
+0

祕密開關!謝謝! :) – 2009-07-23 15:25:03

0

我用下面的效用函數enum類型轉換爲一個哈希表的綁定。它也將駱駝案例名稱重新分配給空格分隔的單詞。

public static Hashtable BindToEnum(Type enumType) 
{ 
    // get the names from the enumeration 
    string[] names = Enum.GetNames(enumType); 
    // get the values from the enumeration 
    Array values = Enum.GetValues(enumType); 
    // turn it into a hash table 
    Hashtable ht = new Hashtable(names.Length); 

    for (int i = 0; i < names.Length; i++) 
     // Change Cap Case words to spaced Cap Case words 
     // note the cast to integer here is important 
     // otherwise we'll just get the enum string back again 
     ht.Add(
      (int)values.GetValue(i), 
      System.Text.RegularExpressions.Regex.Replace(names[i], "([A-Z0-9])", " $1", System.Text.RegularExpressions.RegexOptions.Compiled).Trim() 
      ); 
    // return the dictionary to be bound to 
    return ht; 
} 

你可以輕鬆地適應這種通過採取什麼你把你的問題上,改變了函數的定義是一個泛型函數。

0

也許你可以在一個枚舉做一些與我EnumExtensions

的foreach並創建一個數據源。

3

我認爲最簡單的做法是使用替代鑄造Convert類:

T someValueThatIsAnEnum; 
byte enumValue = Convert.ToByte((object)someValueThatIsAnEnum); 

或者,你可以依靠的事實,枚舉本身可以轉換成字符串表示,並分析自己回以及:

T someValueThatIsAnEnum; 
string enumAsString = someValueThatIsAnEnum.ToString(); 
byte enunValue = (byte)Enum.Parse(typeof(T), enumAsString);