C#如何开启/关闭控制台输出

4

我正在制作一个使用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”,而不是print,我将调用。
public void ConsoleOuptput(...) {
  if(outputOn) {
    Console.WriteLine(...);
  }
} 

需要检查“consoleOn”是否为真,若是,则将参数发送到Console.WriteLine()。

问题在于Console.WriteLine()有19种不同类型的输入参数。是否有一种方法可以编写“如果consoleOn传递所有参数给Console.WriteLine()”的代码。或者有更好的方法来制作可切换的控制台输出。

请记住我正在创建DLL。我不能完全关闭控制台。


如果您只需要控制自己代码生成的输出,那么为什么不使用像 ConsoleOutput 这样的包装方法就足够了呢? - NicoE
2个回答

3
我最近使用的一种非常成功的方法是使用一个可能为null的日志记录器实例(可能只是TextWriter)。现在,纯粹主义者可能会认为“空对象是一种反模式”,但它允许一些很棒的用法,例如:
log?.WriteLine($"Connection from '{from}' to '{to}', {data.Length} bytes to process...");

如果log实例是null,那么基本上是免费的,这要归功于短路求值的方式。当然,Console.Out是一个TextWriter,所以如果您想启用控制台日志记录:

myApp.Log = Console.Out;

同样,你可以将日志记录到文件、网络套接字或任何其他地方——只需更改分配给myApp.Log的内容即可。如果它是null:日志记录就会停止。


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

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

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

但这样不会减少功能吗?新包装的控制台现在只能接受字符串作为参数,而不能像Console.WriteLine("{0}, {1}, {2}", value1, value2, value3);那样传递参数。如果是这样的话,那就不是我需要的。更简单的解决方案是创建一个方法来检查outputOn是否为真,并传递字符串。 - dantex47
@dantex47,这就是为什么我包含了注释的原因;对于您可能需要的所有其他重载,也要执行相同的操作。此外,如果您使用的是C# 6,并且使用字符串插值,那么您实际上不需要更多的内容。 - InBetween

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,