Есть ли метод преобразования, который принимает char и создает ConsoleKey?

Интересно, есть ли какой-либо вспомогательный класс в .NET framework (или где-то еще), который преобразует символы в перечисления ConsoleKey.

e.g 'A' should become ConsoleKey.A

Прежде чем кто-нибудь спросит, почему я хотел бы это сделать. Я хочу написать помощник, который берет строку (например, "Hello World" ) и преобразует ее в последовательность объектов ConsoleKeyInfo. Мне нужно это для некоторых сумасшедших модульных тестов, где я издеваюсь над вводом пользователя.

Я просто немного устал от создания кода клея самостоятельно, поэтому я подумал, может быть, есть способ конвертировать char в перечисление ConsoleKey?

Для полноты здесь есть то, что пока работает отлично

    public static IEnumerable<ConsoleKeyInfo> ToInputSequence(this string text)
    {
        return text.Select(c =>
                               {
                                   ConsoleKey consoleKey;
                                   if (Enum.TryParse(c.ToString(CultureInfo.InvariantCulture), true, out consoleKey))
                                   {
                                       return new ConsoleKeyInfo(c, consoleKey, false, false, false);
                                   }
                                   else if (c == ' ')
                                       return new ConsoleKeyInfo(' ', ConsoleKey.Spacebar, false, false, false);
                                   return (ConsoleKeyInfo?) null;
                               })
            .Where(info => info.HasValue)
            .Select(info => info.GetValueOrDefault());
    }

Ответ 1

Вы пробовали:

char a = 'A';
ConsoleKey ck;
Enum.TryParse<ConsoleKey>(a.ToString(), out ck);

Итак:

string input = "Hello World";
input.Select(c => (ConsoleKey)Enum.Parse(c.ToString().ToUpper(), typeof(ConsoleKey));

или

.Select(c =>
    {
        return Enum.TryParse<ConsoleKey>(a.ToString().ToUpper(), out ck) ?
            ck :
            (ConsoleKey?)null;
    })
.Where(x => x.HasValue) // where parse has worked
.Select(x => x.Value);

Также Enum.TryParse() имеет перегрузку для игнорирования случая.

Ответ 2

Если вы используете .NET4 или более позднюю версию, вы можете использовать Enum.TryParse. и Enum.Parse доступен для .NET2 и более поздних версий.

Ответ 3

Если это [A-Z] и [0-9] OP может использовать его

Это может сработать, потому что ConsoleKey является перечислением

чтобы вы могли сделать что-то вроде этого

char ch = 'A';
ConsoleKey ck = (ConsoleKey) ch;