【问题标题】:Enum.ToString() returns a wrong description c#Enum.ToString() 返回错误的描述 c#
【发布时间】:2014-07-02 17:00:12
【问题描述】:

我们有一个用于 EDI 字段的大型 Enum 类,举个简短的例子,枚举声明如下:

[Description("Ebene")]
Ebene,

[Description("Zaehlpunktdaten")]
Zaehlpunktdaten,

[Description("Zaehlpunkt")]
Zaehlpunkt,

。 .

嗯,当您通过EDIEnums.Zaehlpunktdaten.ToString() 检索枚举时,枚举工作正常,但在其他一些项目中,它返回错误值。

如果我在开头添加一个新的将返回下一个,在此示例中,如果我刚刚添加了Ebene,并且我想检索Zaehlpunktdaten,它将返回Zaehlpunkt。

我们也尝试过=0、=1、=2 等,但它也不起作用。也有本地参考。

对正在发生的事情有什么想法吗?

【问题讨论】:

  • 听起来您已经更改了枚举,但没有重新构建依赖它的所有代码。这是个坏主意。
  • 我猜你在枚举中有重复的值。发布完整的枚举定义。
  • 另外,不要期望 ToString() 返回描述属性的值。
  • 如果问题出现在某些项目中而不出现在其他项目中,则听起来表现出不良行为的项目需要检查并重建其引用。
  • 如果你的应用必须依赖 Enum.ToString 结果,那你就做错了。

标签: c# enums edifact


【解决方案1】:

假设程序集 A 定义了MyEnum。 默认情况下,每个枚举值都被隐式分配一个整数“索引”,如下所示:

public enum MyEnum
{
    X = 1,
    Y = 2,
    Z = 3
}

如果程序集 B 中的源代码使用 MyEnum.Y,则该代码将针对索引 2 处的值进行编译。

如果您现在在开头添加一个新项目,则索引将发生变化:

public enum MyEnum
{
    New = 1,
    X = 2,
    Y = 3,
    Z = 4
}

程序集 B 仍然引用索引 2 处的值,现在是 X 而不是 Y。这是您看到的错误。 这就是为什么添加新的枚举值被认为是一项重大更改。

如果您希望枚举发生变化,您应该自己编号枚举值,而不是使用隐式编号,在编译程序集 B 之前。

您现在有两个选择:

  1. 一种可能的解决方法是在枚举末尾添加新值,以避免移动索引。 但这是一个草率的解决方法。
  2. 现在考虑对枚举值进行编号并根据该程序集重建任何项目。可能看起来工作量很大,具体取决于有多少项目依赖于程序集 A,但它可以帮助您和您的同事避免在未来再次遇到同样的问题。

【讨论】:

  • 我们尝试添加数字并重建,但仍然无法正常工作,但可能是引用没有正确更新,我必须看看这个。
  • @TareqB。您是否重建了定义enum 和任何其他依赖于此的项目的项目?
  • 最后我做了一个草率的解决方法,编号根本不起作用,但我也让它。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多