这要么太聪明一半,要么不够聪明62.784%。出于奇怪的原因,我们的产品管理层决定重新命名我们的一些枚举值以及它们如何序列化。经过几次构建之后,他们决定让它们向后兼容 - 即读取旧处理序列并将其处理为新值。
我以为我首先尝试在枚举中声明新名称,然后在作为同义词之后声明OldName = NewName
,希望等效性能在洗涤中得到解决,而有利于第一个声明,它将使用Enum.Parse
自动将旧版翻译为新版。
我编写了一个像这样的小样本应用程序:
public enum syns
{
Zero,
One,
Two,
Three = Two,
Four,
};
public string SynTest()
{
string result;
syns synTest2 = (syns)syns.Two, synTest3;
bool okay = Enum.TryParse<syns>("Three", out synTest3);
result = (okay).ToString() + "," + (synTest2 == synTest3).ToString() + "," + synTest2.ToString() + "," + synTest3.ToString() + ",";
synTest3 = (syns)Enum.Parse(typeof(syns), "Three");
result += synTest3.ToString();
return result;
}
得到了我想要的东西。解析旧名称"Three"
,并且在评估解析后的值时,它会以相应的方式生成新名称Two
。耶。
所以我在实际代码中使用了这个技术(更长的枚举,有很多特定于应用程序的名称/值等)。在我的机器上工作,所以我检查了它。
我们遇到的问题是,处理方式似乎没有任何一致性。构建进入QA,并且(相当于)"Three"
在整个(旧名称)中解析并保持为Three
,而不是评估到新版本Two
。
在拉动这个线程一段时间之后,看起来大约有50%的机器我们已经尝试过它,就像我的机器一样(新值普遍存在)和50%偏向旧名称。
我尝试将所有测试用例都放到test.aspx页面中,而我的test.aspx页面的行为与底层程序集不同。在test.aspx页面中,上面的枚举与我们代码库中的实际枚举行为不同。
答案 0 :(得分:3)
来电者须知
如果多个枚举成员具有相同的基础值,并且您尝试根据其基础值检索枚举成员名称的字符串表示形式,则您的代码不应对该方法将返回的名称做出任何假设。
(我的重点)
记录此行为有未指明的行为。实际上,在一台计算机上可能存在可观察(看似)一致的行为,具体取决于.NET运行时版本,安装的.NET修补程序等等,但您无法保证它将继续像明天或下周那样运行。
简而言之,你不能这样做,你需要找到另一种方法来处理别名。