Как проверить состояние вне метода - PullRequest
3 голосов
/ 07 января 2020

Есть ли способ проверить целостность переменной класса в той точке кода, в которой она создана?

Например, я создаю и инициализирую переменную-член класса, например this:

public class MyClass
{
  public static Dictionary<MyEnum, int> SomeDictionary = new Dictionary<MyEnum, int> {
            { MyEnum.First, 9 },
            { MyEnum.Second, 7 },
            { MyEnum.Third, 17 }
  };

  // This obviously doesn't compile
  Debug.Assert(<SomeDictionary contains good stuff>);

  // Some method in my class
  public void SomeMethod()
  {
    // I could use something like this in this method to verify
    // the integrity of SomeDictionary, but I'd rather do this
    // at the point (above) where SomeDictionary is defined.
    Contract.Requires(<SomeDictionary contains expected stuff>);
  }
}

Как я отмечаю в коде, я хочу проверить содержимое моих данных в области "класса", но Debug.Assert и Contract.Requires работают только в методе (или свойстве) область действия.

РЕДАКТИРОВАТЬ: В этом вопросе первоначально использовался список, чье содержимое (косвенно) связано с Enum в качестве примера, но люди зациклены на том, как этот список был получен из Enum, а НЕ на вопросе о том, как проверить содержимое списка. Поэтому я полностью переписал вопрос, чтобы уточнить, что речь идет о проверке, а не о построении структуры данных.

Ответы [ 2 ]

0 голосов
/ 09 января 2020

Будет ли этого достаточно? https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/static-constructors

Stati c конструкторы также являются удобным местом для принудительной проверки во время выполнения параметра типа, который не может быть проверен во время компиляции через ограничения (тип ограничения параметров).

Конструктор stati c вызывается автоматически для инициализации класса перед созданием первого экземпляра или ссылками на члены stati c.

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

0 голосов
/ 07 января 2020

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

using System.Linq;

enum Stuff
{
  UglyStuff,
  BrokenStuff,
  HappyStuff
}

public class MyStuff
{
  public static List<string> MyList => System.Enum.GetNames(typeof(Stuff)).ToList();
}
...