【问题标题】:Is there a TextWriter interface to the System.Diagnostics.Debug class, for use with Console.SetOut?System.Diagnostics.Debug 类是否有用于 Console.SetOut 的 TextWriter 接口?
【发布时间】:2012-12-13 17:12:39
【问题描述】:

是否有任何内置功能可以将 Console.WriteLine 调用重定向到 System.Diagnostic.Debug-calls?

我希望是这样的:

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();
}

【问题讨论】:

    标签: c# console-application stdout output-window


    【解决方案1】:

    你可以反过来。使用标准的 Debug/Trace 调用并将ConsoleTraceListener Class 添加到您的配置中。净效果应该与标准编码/行为相同。

    【讨论】:

    • 我正在调用一个调用 Console.WriteLine 的 DLL。
    【解决方案2】:

    你可以这样做:

    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; }
        }
    }
    

    它将在using 语句中将所有Console.WriteLine 调用重定向到Debug.WriteLine。重写 TextWriter 的所有 write 方法非常麻烦,但您可能可以使用 this answer 中的包装器

    【讨论】:

      猜你喜欢
      • 2011-02-16
      • 2017-05-21
      • 2012-06-20
      • 2015-11-02
      • 2016-01-13
      • 2020-10-31
      • 2011-04-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多