C# 同义枚举处理
C# synonymous enum handling
这要么太聪明了一半,要么不够聪明 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
。耶。
所以我在我们的实际代码中使用了该技术(一个更长的枚举,有很多特定于应用程序的 names/values,等等)。在我的机器上工作,所以我签入了它。
我们遇到的问题是处理方式似乎没有任何一致性。构建进行了质量检查,并且(相当于)"Three"
在整个(旧名称)中解析并保持为 Three
,而不是评估为新版本 Two
.
在这个线程上拉了一会儿之后,似乎我们尝试过的机器中大约有 50% 的机器按照我的机器的方式处理它(新值占优势)并且 50% 偏向于旧名称。
我尝试将所有测试用例拉入一个 test.aspx 页面,而我的 test.aspx 页面的行为与底层程序集不同。在 test.aspx 页面中,上面的枚举与我们代码库中的实际枚举不同。
- 关于是什么决定了同义词枚举的评估如何精益的任何提示?
- 知道为什么相同的程序集会在机器之间改变行为吗?所有机器都设置为目标框架 4.5.1,至少在我比较的那对机器上,它们似乎处于相同的补丁级别。
- 即使在我获得所需行为的机器上,将相同的声明拉入 test.aspx 也会改变行为,所以我想知道这是否逐个文件变化无常。
这是 "clearly" 记录在 Enum.ToString 下:
Notes to Callers
If multiple enumeration members have the same underlying value and you attempt to retrieve the string representation of an enumeration member's name based on its underlying value, your code should not make any assumptions about which name the method will return.
(我的重点)
这被记录为具有未指定的行为。实际上,根据 .NET 运行时版本、安装的 .NET 修补程序等,一台机器上可能存在可观察(看似)一致的行为,但您无法保证它明天或下周会继续表现得像那样。
总之,你不能这样做,你需要找到另一种方法来处理别名。
这要么太聪明了一半,要么不够聪明 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
。耶。
所以我在我们的实际代码中使用了该技术(一个更长的枚举,有很多特定于应用程序的 names/values,等等)。在我的机器上工作,所以我签入了它。
我们遇到的问题是处理方式似乎没有任何一致性。构建进行了质量检查,并且(相当于)"Three"
在整个(旧名称)中解析并保持为 Three
,而不是评估为新版本 Two
.
在这个线程上拉了一会儿之后,似乎我们尝试过的机器中大约有 50% 的机器按照我的机器的方式处理它(新值占优势)并且 50% 偏向于旧名称。
我尝试将所有测试用例拉入一个 test.aspx 页面,而我的 test.aspx 页面的行为与底层程序集不同。在 test.aspx 页面中,上面的枚举与我们代码库中的实际枚举不同。
- 关于是什么决定了同义词枚举的评估如何精益的任何提示?
- 知道为什么相同的程序集会在机器之间改变行为吗?所有机器都设置为目标框架 4.5.1,至少在我比较的那对机器上,它们似乎处于相同的补丁级别。
- 即使在我获得所需行为的机器上,将相同的声明拉入 test.aspx 也会改变行为,所以我想知道这是否逐个文件变化无常。
这是 "clearly" 记录在 Enum.ToString 下:
Notes to Callers
If multiple enumeration members have the same underlying value and you attempt to retrieve the string representation of an enumeration member's name based on its underlying value, your code should not make any assumptions about which name the method will return.
(我的重点)
这被记录为具有未指定的行为。实际上,根据 .NET 运行时版本、安装的 .NET 修补程序等,一台机器上可能存在可观察(看似)一致的行为,但您无法保证它明天或下周会继续表现得像那样。
总之,你不能这样做,你需要找到另一种方法来处理别名。