11

我想知道.NET 框架(或其他地方)中是否有任何帮助类将字符转换为 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());
    }
4

3 回答 3

9

你有没有尝试过:

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()重载。

于 2012-07-15T20:03:15.937 回答
1

如果您使用 .NET4 或更高版本,则可以使用Enum.TryParse. 并且Enum.Parse适用于 .NET2 及更高版本。

于 2012-07-15T20:10:34.640 回答
0

如果是 [AZ] & [0-9] OP 可以使用

它可能会起作用,因为 ConsoleKey 是一个枚举

所以你可以做这样的事情

char ch = 'A';
ConsoleKey ck = (ConsoleKey) ch;
于 2012-07-15T20:01:16.477 回答