Реализация ReadKey () в TextReader

У меня есть класс, который принимает ввод через TextReader и позволяет классу получать ввод либо с консоли, либо из текстового поля.

Ниже приводится очень простой пример того, что я пытаюсь сделать:

using System.IO;

class TestReader()
{
    public TextReader CurrentStream { get; }

    public void SetInputStream( TextReader reader)
    {
        Reader = reader;
    }
}

class Program
{
    static void Main( string[] args )
    {
        TestReader rdr = new TestReader();
        rdr.SetInputStream(Console.In);

        var input = (char)rdr.CurrentStream.Read();

        Console.WriteLine( "You selected: " + input );

    }
}

Как мне изменить приведенное выше, чтобы реализовать ReadKey(), поскольку метод Read() в приведенном выше примере продолжает принимать ввод до тех пор, пока не будет нажата клавиша Enter? Я хотел бы реализовать ReadKey (), чтобы он принимал только одно нажатие клавиши.

Спасибо.

** РЕДАКТИРОВАТЬ **

Чтобы прояснить ситуацию, я хочу реализовать ReadKey () без использования Console.ReadKey (). Я не уверен, что это вообще возможно, поскольку Google пока ничего не обнаруживает.


person Intrepid    schedule 15.08.2013    source источник
comment
Вы не можете, потому что средство чтения текста представляет собой поток символов, но клавиша (или комбинация клавиш) не может быть символом.   -  person Darren Kopp    schedule 15.08.2013
comment
@DarrenKopp: В таком случае, как ReadKey() это делает? Теперь похоже, что мне придется реализовать свой собственный ReadKey() метод без использования Console.ReadKey ().   -  person Intrepid    schedule 15.08.2013
comment
ReadKey работает, потому что он перехватывает события нажатия клавиш клавиатуры.   -  person Darren Kopp    schedule 15.08.2013


Ответы (1)


я использовал

     ConsoleKeyInfo info;
     do
     {
        info = Console.ReadKey();
     } while (info.KeyChar != '\n' &&
        info.KeyChar != '\r'); 

чтобы зациклиться, пока я не получу ввод, нажмите

если у вас есть только входной поток или textBox, вы можете просто выполнить инструкцию if. в случае консоли используйте мой пример, в случае textBox прочтите его текст

person No Idea For Name    schedule 15.08.2013
comment
Этот код не годится, потому что вы ссылаетесь на класс Console в своем примере. Я не хочу, чтобы класс знал что-либо о реализациях Console или TextBox, поскольку они должны предоставляться вызывающим приложением, будь то консольное приложение или приложение Winforms. - person Intrepid; 15.08.2013
comment
@MikeClarke textBox может отправлять его текст, а консоль может использовать код, который я вам дал, и отправлять полученный текст, так почему бы не сделать SetInputStream для получения строки? - person No Idea For Name; 15.08.2013
comment
Проблема в том, что класс TextReader не реализует метод ReadKey(), а в вашем примере вы напрямую используете класс Console, который не будет работать в приложении Winforms. - person Intrepid; 15.08.2013