C# 如何将数据库来源的字符串属性值赋值给自定义枚举类型
字符串属性转换为对应枚举类型的实现方法
针对你定义的DiamDivide枚举类型、以及从数据库取值的CalcMethodName字符串属性,可以通过以下方式完成正确的枚举赋值,生产环境建议使用带容错的实现方案,避免数据库脏数据导致程序崩溃。
可用的转换方式
- 基础硬转换:使用
Enum.Parse静态方法完成类型转换
示例代码:
注意:该方法在传入空值、无匹配内容的字符串时会直接抛出运行时异常,不适合直接对接数据库取值的场景。DiamDivide targetEnum = (DiamDivide)Enum.Parse(typeof(DiamDivide), CalcMethodName); - 无异常容错转换(推荐):使用
Enum.TryParse静态方法完成转换
该方法不会主动抛出运行时异常,会通过返回值告知转换是否成功,还可以配置是否忽略大小写匹配,适配数据库存储值大小写不统一的场景。
示例代码:DiamDivide targetEnum; // 第二个参数设为true表示匹配时忽略大小写 bool parseSuccess = Enum.TryParse<DiamDivide>( value: CalcMethodName, ignoreCase: true, result: out targetEnum );
生产环境兜底校验
即使使用TryParse方法,也需要补充一层枚举合法性校验,避免传入纯数字字符串(比如"1")时,被自动映射为对应枚举序号值的非预期情况:
// 校验解析出的值是否是DiamDivide枚举中明确定义的成员 bool isLegal = Enum.IsDefined(typeof(DiamDivide), targetEnum);
完整可落地的示例代码
DiamDivide diamDivideValue; // 处理空值场景 if (string.IsNullOrWhiteSpace(CalcMethodName)) { // 按业务规则设置默认值,例如默认赋值为DiamDivide.Absolute diamDivideValue = DiamDivide.Absolute; } else { // 尝试解析字符串,同时校验值合法性 if (Enum.TryParse<DiamDivide>(CalcMethodName, true, out var parsedValue) && Enum.IsDefined(typeof(DiamDivide), parsedValue)) { diamDivideValue = parsedValue; } else { // 遇到不匹配的脏数据时,可根据业务逻辑选择记日志、走默认值、抛出业务自定义异常 diamDivideValue = DiamDivide.Absolute; } }
注意:如果业务要求枚举值必须和字符串完全大小写匹配,只需要将
TryParse方法中的ignoreCase参数设置为false即可。
内容的提问来源于stack exchange,提问作者user8441630
相关产品推荐
相关产品推荐

