Это очень быстро и грязно.Однако у него есть преимущество в том, что вы можете создать любое меню с любым типом enum
.
Разделяет слова на основе регистров (верхний / нижний) переходов.Это работает, за исключением вашего MaxMenuSelection.Вместо того, чтобы помещать это в ваш enum, сделайте его функцией шаблона (для типа enum), которая возвращает GetValues (). Length (см. Ниже):
Показанный ниже where
равен where T : struct
, потому что компиляторЯ использую не поддерживает where T : System.Enum
, что было бы намного лучше, но требует новейшего компилятора.
public static string SeparateWords(string enumName)
{
var buffer = new StringBuilder();
var wasLower = false;
foreach (var c in enumName)
{
if (wasLower && char.IsUpper(c))
{
buffer.Append(' ');
}
buffer.Append(c);
wasLower = char.IsLower(c);
}
return buffer.ToString();
}
public static void DisplayMenu<T>() where T : struct //should be System.Enum if possible
{
var enumType = typeof(T);
var names = Enum.GetNames(enumType);
var values = Enum.GetValues(enumType) as int[];
for (var i = 0; i < names.Length; ++i)
{
Console.WriteLine($"[{values[i]}] {SeparateWords(names[i])}");
}
}
Я получаю этот вывод:
[1] Create Customer
[2] Create Account
[3] Set Account Balance
[4] Display Account Balance
[5] Exit
[5] Max Menu Selection
Когда я вызываю это:
EnumTest.DisplayMenu<MenuSelection>();
И вы можете получить «Макс. Выбор меню», выполнив это:
public static int MaxMenuSelection<T>() where T : struct
{
return Enum.GetValues(typeof(T)).Length;
}