这要么太聪明了一半,要么不够聪明 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 页面中,上面的枚举的行为与我们代码库中的实际枚举不同。
这“清楚地”记录在Enum.ToString下:
调用者注意事项
如果多个枚举成员具有相同的基础值,并且您尝试根据其基础值检索枚举成员名称的字符串表示形式,则您的代码不应对该方法将返回哪个名称做出任何假设。
(我的重点)
据记录,这具有未指定的行为。事实上,一台机器上可能存在可观察到的(看似)一致的行为,具体取决于 .NET 运行时版本、安装的 .NET 修补程序等,但您不能保证明天或下周它会继续表现得像这样。
简而言之,你不能这样做,你需要找到另一种方法来处理别名。
| 归档时间: | 
 | 
| 查看次数: | 522 次 | 
| 最近记录: |