C# 同义枚举处理

use*_*043 4 c# asp.net enums

这要么太聪明了一半,要么不够聪明 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;
}
Run Code Online (Sandbox Code Playgroud)

并得到了我想要的。解析旧名称"Three",当评估解析值时,它会以Two各种方式生成新名称。耶。

因此,我在实际代码中使用了该技术(更长的枚举,具有许多特定于应用程序的名称/值等)。在我的机器上工作,所以我检查了它。

我们遇到的问题是处理方式似乎没有任何一致性。构建进行了 QA,并且(相当于)"Three"解析并保持为Three整个(旧名称),而不是评估新版本Two

在拉动这个线程一段时间后,我们尝试过的机器中大约有 50% 的机器以我的机器的方式处理它(新值占主导地位),而 50% 的机器偏向于旧名称。

我尝试将所有测试用例拉入 test.aspx 页面,并且我的 test.aspx 页面的行为与底层程序集不同。在 test.aspx 页面中,上面的枚举的行为与我们代码库中的实际枚举不同。

  1. 关于什么决定了同义词枚举的评估如何倾斜有任何提示吗?
  2. 有什么想法为什么相同的组件会改变机器之间的行为吗?所有机器都设置为目标框架 4.5.1,至少在我比较的几台机器上,它们似乎处于相同的补丁级别。
  3. 即使在我获得所需行为的机器上,将相同的声明拉入 test.aspx 也会改变行为,所以我想知道这是否在逐个文件的基础上变化无常。

ang*_*son 5

这“清楚地”记录在Enum.ToString下:

调用者注意事项
如果多个枚举成员具有相同的基础值,并且您尝试根据其基础值检索枚举成员名称的字符串表示形式,则您的代码不应对该方法将返回哪个名称做出任何假设。

(我的重点)

据记录,这具有未指定的行为。事实上,一台机器上可能存在可观察到的(看似)一致的行为,具体取决于 .NET 运行时版本、安装的 .NET 修补程序等,但您不能保证明天或下周它会继续表现得像这样。

简而言之,你不能这样做,你需要找到另一种方法来处理别名。