C#同义枚举处理

C#同义枚举处理,c#,asp.net,enums,C#,Asp.net,Enums,这要么聪明过半,要么不够聪明62.784%。出于奇怪的原因,我们的产品管理层决定重命名我们的一些枚举值及其序列化方式。在两次构建之后,他们决定希望它是向后兼容的,即读取旧的序列化并将其处理为新的值 我想我应该先在enum中声明新名称,然后将OldName=NewName作为同义词声明,希望在wash中得到等价性,以支持第一个声明,并使用enum.Parse自动将旧名称转换为新名称 我制作了一个示例应用程序,如下所示: public enum syns { Zero, One,

这要么聪明过半,要么不够聪明62.784%。出于奇怪的原因,我们的产品管理层决定重命名我们的一些枚举值及其序列化方式。在两次构建之后,他们决定希望它是向后兼容的,即读取旧的序列化并将其处理为新的值

我想我应该先在enum中声明新名称,然后将
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页面中,上述枚举的行为与代码库中的实际枚举不同

  • 关于什么决定同义词枚举的计算结果如何的任何提示
  • 你知道为什么相同的程序集会在不同的机器之间改变行为吗?所有的机器都设置为目标框架4.5.1,至少在我比较的这对机器上,它们似乎处于相同的补丁级别
  • 即使在一台获得了所需行为的机器上,将相同的声明拉入test.aspx也会改变行为,因此我想知道在逐个文件的基础上这是否易变
  • 这“清楚”记录在:

    来电者须知
    如果多个枚举成员具有相同的基础值,并且您尝试根据其基础值检索枚举成员名称的字符串表示形式,您的代码不应假设该方法将返回哪个名称。

    (我的重点)

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


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

    您是否考虑过将旧数据反序列化为具有旧格式的临时数据结构,然后在内存中将其转换为新的数据结构?或者,如果不进行反序列化,您可能无法区分新旧文件格式?谢谢,女士。。。代码中执行解析的地方后面跟着.ToString()==.ToString(),无论如何都很奇怪,所以我删除了对.ToString()的额外调用,直接比较了枚举。但谢谢你指出我遗漏的关键点——好的警告。