Существует ли интерфейс TextWriter для класса System.Diagnostics.Debug для использования с Console.SetOut?

Есть ли что-нибудь встроенное, что может перенаправить вызовы Console.WriteLine на вызовы System.Diagnostic.Debug?

Я надеялся на что-то вроде этого:

public static void CallNastyConsoleWriteLineUsingFunction() {
    Console.WriteLine(GetImportantInformation());
}

[...]

var writer = DebugTextWriter();
TextWriter stdout = Console.Out;
try
{
    Console.SetOut(writer);
    CallNastyConsoleWriteLineUsingFunction();
}
finally
{
    Console.SetOut(stdout);
}

Или, может быть, даже:

using(new ConsoleToDebugRedirector())
{
    CallNastyConsoleWriteLineUsingFunction();
}

2 ответа

Вы можете сделать наоборот. Используйте стандартные вызовы Debug/Trace и добавьте класс ConsoleTraceListener в свою конфигурацию. Чистый эффект должен быть таким же, как при стандартном кодировании / поведении.

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

public class Program
{
    public static void Main(string[] args)
    {
        using (new ConsoleRedirect<DebugTextWriter>())
        {
            Console.WriteLine("Testing testing...");
        }

        Console.WriteLine("Testing testing 2...");
        Console.ReadLine();
    }
}

public class ConsoleRedirect<T> : IDisposable
    where T : TextWriter, new()
{
    private readonly TextWriter _tmpTextWriter;

    public ConsoleRedirect()
    {
        _tmpTextWriter = Console.Out;
        Console.SetOut(new T());
    }

    public void Dispose()
    {
        Console.SetOut(_tmpTextWriter);
    }
}

public class DebugTextWriter : TextWriter
{
    public override void WriteLine(string value)
    {
        Debug.WriteLine(value);
    }

    public override void WriteLine(object value)
    {
        Debug.WriteLine(value);
    }

    public override void WriteLine(string format, params object[] arg)
    {
        Debug.WriteLine(format, arg);
    }

    public override Encoding Encoding
    {
        get { return Encoding.UTF8; }
    }
}

Это перенаправит все Console.WriteLine звонки в Debug.WriteLine в то время как внутри using заявление. Это довольно громоздко переопределить все методы записи TextWriter, но вы могли бы использовать оболочку в этом ответе

Другие вопросы по тегам