Enum helper в c # не дает ожидаемого результата - PullRequest
2 голосов
/ 15 апреля 2011

По какой-то причине я не получаю правильный тип enum по какой-то причине и не могу понять, почему мой код указан ниже, большое спасибо за любые указатели / объяснения ...

РЕДАКТИРОВАТЬ: type->изменилось на другое имя (спасибо, ребята, за заголовки)

Помощник:

 public static T Convert<T>(this string str)
    {
        return (T)Enum.Parse(typeof(T), str, true);
    }

Перечислим значения:

public enum anothername
    {
        SmallText = 100,
        Number = 15,
        TextArea = 0,
        Bool = 0,
        Choices = 0,
    }

Мой тест:

 [Test]
        public void EnumGetStringFromEnumType()
        {
            //arrange
            var MaxLength = EnumHelper.Convert<anothername>("TextArea").ToString();

            //act

            //assert
            Assert.AreEqual("TextArea", MaxLength);


        }

РЕДАКТИРОВАТЬ:

Спасибо, удаление значений int решило это!

Однако ... что если я действительно хотел бы сказать значения для некоторых типов перечисления, а не для других, например

public enum anothername
    {
        SmallText = 100,
        Number = 15,
        TextArea,
        Bool,
        Choices,
    }

Тест 2:

[Test]
        public void EnumGetIntValueOrStringFromEnumType()
        {
            //arrange
            var MaxLength = EnumHelper.ToEnumSafe<anothername>("TextArea");

            //act

            //assert
            Assert.AreEqual(null, (int)MaxLength);

        }

У меня точно такая же проблема, когда я пытаюсь получить значения int, я получаю неверные результаты ... result = 16

1 Ответ

7 голосов
/ 15 апреля 2011

В перечислении есть повторяющиеся элементы с тем же базовым значением, что и TextArea (Bool и Choices). Хотя анализ должен завершиться успешно, значение ToString в результирующем экземпляре enum не определено и может не совпадать с «TextArea», как ожидает ваше утверждение.

Из Enum.ToString документация:

Если несколько членов перечисления имеют та же основная ценность и вы попытаться получить строку представление перечисления имя участника на основе его основного значение, ваш код не должен делать какие-либо предположения о том, какое имя метод вернется.

EDIT

В ответ на ваше изменение попробуйте следующее утверждение:

var MaxLength = EnumHelper.ToEnumSafe<anothername>("TextArea");
Assert.AreEqual(anotherName.TextArea, MaxLength);

или, если вы предпочитаете сравнивать базовый тип:

Assert.AreEqual((int)anotherName.TextArea, (int)MaxLength);

Создается впечатление, что член перечисления не связан с базовым значением, если его значение не указано явно . Это не вариант; все члены перечисления связаны с базовым значением. Правила для «неявных» ассоциаций задаются (из спецификации языка ):

• Если член перечисления является первым перечислением член, объявленный в типе enum, его ассоциированное значение равно нулю.

• В противном случае, ассоциированное значение перечисления член получается путем увеличения ассоциированное значение текстуально предыдущий член перечисления одним. это увеличенное значение должно быть в пределах диапазон значений, которые могут быть представлен базовым типом, в противном случае возникает ошибка времени компиляции.

...