Как предотвратить повторяющиеся значения в enum? - PullRequest
13 голосов
/ 15 сентября 2009

Интересно, есть ли способ предотвратить enum с дублирующимися ключами для компиляции?

Например, это enum ниже скомпилирует

public enum EDuplicates
{
    Unique,
    Duplicate = 0,
    Keys = 1,
    Compilation = 1
}

Хотя этот код

Console.WriteLine(EDuplicates.Unique);
Console.WriteLine(EDuplicates.Duplicate);
Console.WriteLine(EDuplicates.Keys);
Console.WriteLine(EDuplicates.Compilation);

Распечатает

Duplicate
Duplicate
Keys
Keys

Ответы [ 4 ]

18 голосов
/ 09 июля 2013

Вот простой модульный тест, который проверяет его, должен быть немного быстрее:

[TestMethod]
public void Test()
{
  var enums = (myEnum[])Enum.GetValues(typeof(myEnum));
  Assert.IsTrue(enums.Count() == enums.Distinct().Count());
}
17 голосов
/ 15 сентября 2009

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

3 голосов
/ 22 августа 2018

Модульный тест, который проверяет перечисление и показывает, какие конкретные значения перечисления имеют дубликаты:

[Fact]
public void MyEnumTest()
{
    var values = (MyEnum[])Enum.GetValues(typeof(MyEnum));
    var duplicateValues = values.GroupBy(x => x).Where(g => g.Count() > 1).Select(g => g.Key).ToArray();
    Assert.True(duplicateValues.Length == 0, "MyEnum has duplicate values for: " + string.Join(", ", duplicateValues));
}
0 голосов
/ 15 сентября 2009
public bool ValidateAllDistinct(Type enumType)
{
    return !Enum.GetNames(enumType).All(outerName
        => Enum.GetNames(enumType).Any(innerName
            => innerName == outerName 
                ? true 
                : Enum.Parse(enumType, innerName) != Enum.Parse(enumType, outerName)));
}

Я простой метод тестирования для вашего юнит-теста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...