枚举成员赋值提示需常量,如何将方法返回值转为常量?
问题描述
当尝试用以下代码给枚举成员赋值时:
[EnumMember] PersonalDataChemicalSubstanceQuestionMD_1 = EnumsHelpers.GetWizID("PersonalDataChemicalSubstanceQuestionMD_1")
出现错误提示:The expression being assigned to "" must be a constant
辅助方法代码如下:
private static int wizId = 0; /// <summary> /// Summary /// </summary> /// <returns></returns> public static int GetWizID(string pdq) { var server = Properties.Settings.Default.ServerEnvironment; switch (server) { case "DEV": switch (pdq) { case "PersonalDataChemicalSubstanceQuestionMD_1": wizId = 3728; break; } break; } return wizId; }
请问能否将该方法的返回值转为常量?该如何解决这个问题?
解决方案
首先明确:无法将这个方法的返回值转为常量。C#要求枚举成员的赋值必须是编译期可确定的常量表达式,而你的GetWizID方法依赖运行时读取的配置(Properties.Settings.Default.ServerEnvironment),属于运行时计算的值,根本无法在编译阶段确定,因此不能直接用于枚举成员赋值。
以下是几种可行的替代解决方案:
方案1:用静态类替代枚举
既然需要根据环境动态确定ID值,直接放弃枚举,改用静态类存储这些动态值:
public static class PersonalDataQuestionIds { public static readonly int ChemicalSubstanceQuestionMD_1; static PersonalDataQuestionIds() { var server = Properties.Settings.Default.ServerEnvironment; switch (server) { case "DEV": ChemicalSubstanceQuestionMD_1 = 3728; break; // 可扩展其他环境的分支 default: ChemicalSubstanceQuestionMD_1 = 0; // 设置默认值 break; } } }
使用时直接访问PersonalDataQuestionIds.ChemicalSubstanceQuestionMD_1即可,静态构造函数会在第一次访问类时完成初始化。
方案2:保留枚举,运行时建立映射
如果必须保留枚举结构,可以给枚举成员设置固定占位常量,再在运行时建立枚举与实际WizID的映射:
public enum PersonalDataQuestions { [EnumMember] ChemicalSubstanceQuestionMD_1 = 1 // 固定占位常量 } public static class QuestionIdMapper { private static readonly Dictionary<PersonalDataQuestions, int> _idMap; static QuestionIdMapper() { _idMap = new Dictionary<PersonalDataQuestions, int>(); var server = Properties.Settings.Default.ServerEnvironment; if (server == "DEV") { _idMap[PersonalDataQuestions.ChemicalSubstanceQuestionMD_1] = 3728; } // 扩展其他环境的映射规则 } public static int GetWizID(PersonalDataQuestions question) { return _idMap.TryGetValue(question, out var id) ? id : 0; } }
使用时先通过枚举,再调用QuestionIdMapper.GetWizID(PersonalDataQuestions.ChemicalSubstanceQuestionMD_1)获取实际ID。
方案3:编译期条件常量(仅适用于固定环境编译)
如果你的环境是编译时确定的(比如单独编译DEV版本),可以用编译指令定义常量:
public enum PersonalDataQuestions { [EnumMember] #if DEV ChemicalSubstanceQuestionMD_1 = 3728 #else ChemicalSubstanceQuestionMD_1 = 0 // 其他环境默认值 #endif }
需要在项目属性中添加对应的编译符号(如DEV),适合不同环境单独编译的场景,但无法在同一程序内根据运行时配置切换。
内容的提问来源于stack exchange,提问作者robbins
相关产品推荐
相关产品推荐

