Console.ReadLine(bool intercept ) が欲しい!

と、思いませんか? うまいもんはうまい。by はや

コンソールなプログラムを C# で組んでいると、パスワードなど見せてはいけないものを入力するケースって意外にありますよね。そういうとき、Linuxとかだと、シェルスクリプトで stty でファイトー、一発!!ってなもんですが、かなしきかな、C#(というより、.Net Frameworkのクラスライブラリ)には、適当なものがありませぬ。

クラスライブラリの広大な海から、やっとこさ、System.Console.ReadKey(bool)というものを見つけました。が、やっぱりその辺は自作しないといけないようで・・・。Console.ReadKey(bool)ってのがあるんだから、Console.ReadLine(bool)くらい作っておいて欲しい・・・そこまで頼るな!って?

どうでもいいけど、拡張メソッドの静的バージョンって欲しいよう(^^;;; Consoleクラスに自作静的メソッドをバカバカ追加して自己満に浸りたい・・・。

愚痴はさておき・・・忘れないようにコード・メモです

  /// <summary>
  /// コンソール関連のヘルパー&ラッパー関数など。C#4.0必須
  /// </summary>
  public static class ConsoleEx
    {
      /// <summary>
      /// メッセージを出力してキー入力を待機します。
      /// </summary>
      public static ConsoleKeyInfo WriteLineAndReadKey(string msg = "\n何かキーを押してください。",bool echoback = false)
        {
           Console.WriteLine(msg);
           return Console.ReadKey(echoback);
        }
      public static string WriteAndReadLine(string mesg,bool intercept = false)
        {
          if(!string.IsNullOrEmpty(mesg))
              Console.Write(mesg);

          return ReadLine(intercept);
        }

      /// <summary>
      ///  エコーバック無しにキー入力を行う。(たぶん日本語はだめ)
      /// </summary>
      /// <returns>入力値</returns>
      public static string ReadLine(bool intercept,char mask = '*')
        {
          if(!intercept)
            return Console.ReadLine();

          var cs = new List<char>();
          bool isContinue = true;
          while(isContinue)
            {
              var ki = Console.ReadKey(true);
              switch(ki.Key)
                {
                  case ConsoleKey.Escape:
                    cs.Clear();
                    goto case ConsoleKey.Enter;
                  case ConsoleKey.Enter:
                    isContinue = false;
                    break;
                  case ConsoleKey.Backspace:
                    if(cs.Count > 0)
                      {
                        cs.RemoveAt(cs.Count - 1);
                        Console.Write("\b \b");
                      }
                    break;
                  default:
                    if(ki.KeyChar != '\0')
                      cs.Add(ki.KeyChar);
                    Console.Write(mask);
                    break;
                }
            }
          return new string(cs.ToArray());
        }
    }

追記:バグ修正 (2017/05/17)

コメントを残す