2009-07-23 154 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);