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

时间:2016-09-16 16:07:23

标签: c# console console-application

我正在制作一个使用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时,输入参数都将传递给打印并在控制台输出上打印。如果调用consoleOutput(false),那么dprint2将是无效的空函数。

我试图在C#中做同样的事情,我的班级会有私有变量“consoleOn”,而不是打印我会打电话

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

将检查“consoleOn”是否为true,如果是,则将参数发送到Console.WriteLine()。

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

请记住我正在制作DLL。我不能完全转动控制台。

2 个答案:

答案 0 :(得分:3)

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

log?.WriteLine($"Connection from '{from}' to '{to}', {data.Length} bytes to process...");
由于评估短路的方式,如果log实例为null

基本上是免费的 。当然,Console.OutTextWriter,因此如果要启用控制台日志记录:

myApp.Log = Console.Out;

但同样,您可以通过更改分配给myApp.Log的内容来登录文件,网络套接字或其他任何内容。如果是null:日志记录就会停止。

答案 1 :(得分:0)

另一个选择是简单地用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.
}

或者,如果它是非常本地的,比如一种方法,您甚至可以考虑根据Action定义本地outputOn

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