C#同义枚举处理
这要么聪明过半,要么不够聪明62.784%。出于奇怪的原因,我们的产品管理层决定重命名我们的一些枚举值及其序列化方式。在两次构建之后,他们决定希望它是向后兼容的,即读取旧的序列化并将其处理为新的值 我想我应该先在enum中声明新名称,然后将C#同义枚举处理,c#,asp.net,enums,C#,Asp.net,Enums,这要么聪明过半,要么不够聪明62.784%。出于奇怪的原因,我们的产品管理层决定重命名我们的一些枚举值及其序列化方式。在两次构建之后,他们决定希望它是向后兼容的,即读取旧的序列化并将其处理为新的值 我想我应该先在enum中声明新名称,然后将OldName=NewName作为同义词声明,希望在wash中得到等价性,以支持第一个声明,并使用enum.Parse自动将旧名称转换为新名称 我制作了一个示例应用程序,如下所示: public enum syns { Zero, One,
OldName=NewName
作为同义词声明,希望在wash中得到等价性,以支持第一个声明,并使用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;
}
公共枚举syns
{
零,,
一,,
二,,
三等于二,
四,,
};
公共字符串SynTest()
{
字符串结果;
syns-synTest2=(syns)syns.Two,synTest3;
bool-ok=Enum.TryParse(“三”,out-synTest3);
结果=(好的).ToString()+”,“+(synTest2==synTest3.ToString()+”,“+synTest2.ToString()+”,“+synTest3.ToString()+”,”;
synTest3=(syns)Enum.Parse(typeof(syns),“三”);
结果+=synTest3.ToString();
返回结果;
}
得到了我想要的。旧名称“三个”
被解析,当解析的值被求值时,它从各个方向产生新名称Two
。耶
因此,我在实际代码中使用了这种技术(一个更长的枚举,有许多特定于应用程序的名称/值,等等)。在我的机器上工作,所以我登记了
我们面临的问题是,在处理方式上似乎没有任何一致性。构建得到了QA,并且(相当于)“三个”
解析并始终保持为Three
(旧名称),而不是评估为新版本Two
在使用这条线一段时间后,似乎有50%的机器像我的机器那样处理它(新值占主导地位),50%的机器偏向旧名称
我尝试将所有测试用例拉入test.aspx页面,我的test.aspx页面的行为与底层程序集不同。在test.aspx页面中,上述枚举的行为与代码库中的实际枚举不同
如果多个枚举成员具有相同的基础值,并且您尝试根据其基础值检索枚举成员名称的字符串表示形式,您的代码不应假设该方法将返回哪个名称。 (我的重点) 这被记录为具有未指定的行为。事实上,根据.NET运行时版本、.NET修补程序的安装等,一台机器上可能存在可观察到的(看似)一致的行为,但您不能保证明天或下周它会继续这样
简而言之,您不能这样做,您需要找到另一种处理别名的方法。您是否考虑过将旧数据反序列化为具有旧格式的临时数据结构,然后在内存中将其转换为新的数据结构?或者,如果不进行反序列化,您可能无法区分新旧文件格式?谢谢,女士。。。代码中执行解析的地方后面跟着.ToString()==.ToString(),无论如何都很奇怪,所以我删除了对.ToString()的额外调用,直接比较了枚举。但谢谢你指出我遗漏的关键点——好的警告。