c#打开/关闭控制台输出

本文关键字:控制台 输出 打开 | 更新日期: 2023-09-27 18:07:28

我正在制作一个使用SharpPcap分析网络流量的c# DLL。我想实现的一件事是可切换控制台输出。这个想法是在我的类

中有一个方法
public void ConsoleOutputOn(bool outputOn)

如果需要控制台输出,则接收true,如果不需要,则接收false。我不知道该怎么实现。

在LUA中我可以写
local dprint2 = function() end
function consoleOutput(outputOn)
  if (outputON == true) then
    dprint2 = function(...)
      print(...)
    end
  else
    dprint2 = function() end
  end
end

如果调用consoleOutput(true),则dprint2将变为print,并且每次调用dprint2时,输入参数将传递给print并在控制台输出上打印。如果调用了consoleOutput(false),则dprint2将是空函数,不执行任何操作。

我尝试在c#中做同样的事情,我的类将有私有变量"consoleOn",而不是打印,我将调用

public void ConsoleOuptput(...) {
  if(outputOn) {
    Console.WriteLine(...);
  }
} 

检查"consoleOn"是否为真,如果为真,则向Console.WriteLine()发送参数。

问题是Console.WriteLine()对所有类型的输入参数重载了19次。是否有一种方法来编码"如果sonsoleOn传递所有参数到Console.WriteLine()"。或者有没有更好的方法使控制台输出可切换。

请记住,我正在制作DLL。我不能完全打开控制台

c#打开/关闭控制台输出

我最近使用的一种非常成功的方法是使用允许为null的记录器实例(可能只是TextWriter)。现在,纯粹主义者可能会认为"null对象是一种反模式",但它允许一些很棒的用法,例如:

log?.WriteLine($"Connection from '{from}' to '{to}', {data.Length} bytes to process...");
如果log实例为null,则

基本自由,这要归功于短路评估的方式。当然,Console.OutTextWriter,所以如果您想启用控制台日志记录:

myApp.Log = Console.Out;

但同样你可以记录到一个文件,或一个网络套接字,或任何其他-只需改变你分配给myApp.Log。如果是null,日志记录就会停止。

另一个选择是简单地用toggable类包装Console:

public class MyToggableConsole
{
    public bool On { get; }
    public void WriteLine(string message)
    {
        if (!On)
           return;
        Console.WriteLine(msg);
    }
    //Do same for all other `WriteLine` and `Write` overloads you need.
}

或者如果它是非常局部的,比如一个方法,你甚至可以考虑基于outputOn定义一个本地Action:

var WriteToOutput = outputOn ? new Action<string>(s => Console.WriteLine(s) : new Action<string>(s => { } );