泛型场景下如何将整型值转换为枚举类型?
泛型枚举转换的编译问题解决方法
问题背景
想要实现一个泛型函数,接收枚举类型作为泛型参数T,根据传入的int类型ID获取对应的枚举值(结果可能为null),但原代码在编译时出现错误。
原代码(编译失败)
public T? GetEnumValue<T>(int id) where T: struct { // 模拟从数据库读取枚举对应的整型值,结果可能为null int? rawVal = 1; if (rawVal == null) return null; return (T)rawVal.Value; // 编译失败:编译器无法确定T为枚举类型 }
枚举定义与使用示例
枚举定义:
public enum SomeEnum { A, B, } public enum AnotherEnum { C, D, }
使用示例:
SomeEnum? val = GetEnumValue<SomeEnum>(5); AnotherEnum? val2 = GetEnumValue<AnotherEnum>(3);
编译失败原因
泛型约束仅指定了T: struct,这意味着T可以是任何值类型(比如int、bool等),编译器无法确认T是枚举类型,因此直接将int值强制转换为T的操作不被允许。
解决方案
使用Enum.ToObject方法,该方法可以将整型值转换为指定枚举类型的实例,修改后的关键行代码如下:
return (T)Enum.ToObject(typeof(T), rawVal.Value);
修改后的完整函数:
public T? GetEnumValue<T>(int id) where T: struct { int? rawVal = 1; if (rawVal == null) return null; return (T)Enum.ToObject(typeof(T), rawVal.Value); }
该方案经测试可正常运行,满足将整型值转换为目标枚举类型的需求,且符合调用时T始终为拥有整型底层值的枚举类型的前提。
内容的提问来源于stack exchange,提问作者Moe Sisko
相关产品推荐
相关产品推荐

