如何在泛型方法中获取枚举的数据值?

Sha*_*ica 3 c# linq generics enums

由于这个问题,我设法弄清楚如何限制我的通用方法仅接受枚举。

现在,我尝试创建一个通用方法,以便可以将下拉列表绑定到我选择的任何枚举,在下拉列表中显示描述,其值等于枚举值的数值

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;
}
Run Code Online (Sandbox Code Playgroud)

看起来不错,但 ToByte() 始终返回 0,即使我的枚举已显式设置值,如下所示:

public enum TStatus : byte {
  Active = 1,
  Inactive = 0,
}
Run Code Online (Sandbox Code Playgroud)

在泛型方法之外,如果我将类型值强制转换TStatusbyte,它会完美地工作。在泛型方法中,如果我尝试将某些类型强制转换为,T则会byte出现编译器错误。我在 Enum 静态接口中也找不到任何可以执行此操作的内容。

那么,如何获取泛型内枚举的数值呢?(我也将感激地接受有关优化我的代码的任何其他建议......)

编辑:嗯,呃...事实证明这件事不起作用...因为我的 ToByte() 方法中有一个错误...(脸红)。哦,好吧,无论如何,谢谢 - 我从中学到了很多东西!

LBu*_*kin 5

我认为最简单的方法是使用 Convert 类而不是强制转换:

T someValueThatIsAnEnum;
byte enumValue = Convert.ToByte( (object)someValueThatIsAnEnum );
Run Code Online (Sandbox Code Playgroud)

或者,您可以依赖这样一个事实:枚举可以将自身转换为字符串表示形式,并解析自身:

T someValueThatIsAnEnum;
string enumAsString = someValueThatIsAnEnum.ToString();
byte enunValue = (byte)Enum.Parse( typeof(T), enumAsString );
Run Code Online (Sandbox Code Playgroud)