Enum.ToString() возвращает неправильное описание C#
У нас есть большой класс Enum для полей EDI, просто для краткости, перечисления объявляются так:
[Description("Ebene")]
Ebene,
[Description("Zaehlpunktdaten")]
Zaehlpunktdaten,
[Description("Zaehlpunkt")]
Zaehlpunkt,
,,
Ну, перечисления работают нормально, когда вы извлекаете их EDIEnums.Zaehlpunktdaten.ToString()
, но в некоторых других проектах он возвращает неправильное значение.
Если я добавлю новый в начале, вернется точно следующий, в этом примере, если я только что добавил Ebene
и я хочу получить Zaehlpunktdaten
, это вернет меня Zaehlpunkt
,
Мы пробовали также с =0
, =1
, =2
и т.д., и это тоже не работает. Также с местными ссылками.
Есть идеи о том, что происходит?
1 ответ
Скажем, сборка А определяет 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.
Теперь у вас есть два варианта:
- Возможный обходной путь - добавить новое значение в конце перечисления, чтобы избежать смещения индексов. Но это небрежный обходной путь.
- Теперь рассмотрите нумерацию значений enum и перестройте все проекты в зависимости от этой сборки. Это может выглядеть как большая работа, в зависимости от того, сколько проектов зависит от сборки A, но это избавит вас и ваших коллег от повторения этой же проблемы в будущем.