c# - 有没有办法将 Console.Write 的结果连续镜像到集合(数组、列表等)?

标签 c# .net visual-studio .net-4.0 c#-4.0

我有一个控制台程序,我想不断地镜像 Console.Write 的结果到一个集合中,我可以实时查看它的尾部。集合可以是数组、列表等。

我假设我必须使用某种事件处理程序?

我不介意被指向第 3 方库的方向,例如NLog.

更新

我需要在内存中维护一个集合,它反射(reflect)了当前的控制台状态(然后我可以使用套接字发送到远程 WinForms 应用程序)。撇开细节不谈,我想我可以用几行 C# 代码来做到这一点——我不想添加一个巨大的日志记录库,除非它没有很好的需要。

最佳答案

Console 类允许您替换输出和错误流。正是您在这里需要的,您可以将它们替换为 TextWriter,该 TextWriter 还会记录所写内容。示例实现:

    class ConsoleLogger : System.IO.TextWriter {
        private System.IO.TextWriter oldOut;
        private Queue<string> log = new Queue<string>();
        private StringBuilder line = new StringBuilder();
        private object locker = new object();
        private int newline;
        private int logmax;

        public ConsoleLogger(int history) {
            logmax = history;
            oldOut = Console.Out;
            Console.SetOut(this);
        }
        public override Encoding Encoding {
            get { return oldOut.Encoding; }
        }
        public override void Write(char value) {
            oldOut.Write(value);
            lock (locker) {
                if (value == '\r') newline++;
                else if (value == '\n') {
                    log.Enqueue(line.ToString());
                    if (log.Count > logmax) log.Dequeue();
                    line.Length = newline = 0;
                }
                else {
                    for (; newline > 0; newline--) line.Append('\r');
                    line.Append(value);
                }
            }
        }
    }

用法:

    static void Main(string[] args) {
        var outLogger = new ConsoleLogger(100);
        // etc...
    }

关于c# - 有没有办法将 Console.Write 的结果连续镜像到集合(数组、列表等)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5368229/

相关文章:

c# - 非常奇怪的 C# 泛型问题

c# - "yield break;"在 C# 中有什么作用?

c# - 基本聚合问题

visual-studio - SCONS 的 Visual Studio 解决方案?

node.js - 当这些错误阻止时,如何生成 d.ts 文件类型?

c# - MySQL 数据库未显示在数据源中

c# - 如何转义双引号内的引号?

c# - 将控件的属性保存到 xml

c# - 编写此属性和构造函数代码的更好方法?

c# - Microsoft 可视化链接表单/项目