我正在制作一个使用 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# 中做同样的事情,我的类会有私有(private)变量“consoleOn”,而不是打印我会调用
public void ConsoleOuptput(...) {
if(outputOn) {
Console.WriteLine(...);
}
}
这将检查“consoleOn”是否为真,如果是,则将参数发送到 Console.WriteLine()。
问题是 Console.WriteLine() 对于各种输入参数都重载了 19 次。甚至有一种方法来编码“如果sonsoleOn 将所有参数传递给Console.WriteLine()”。或者有没有更好的方法来制作可切换的控制台输出。
请记住我正在制作 DLL。我不能完全关闭控制台。
最佳答案
我最近非常成功地使用的一种方法是使用允许为空的记录器实例(可能只是 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
:日志记录就会停止。关于C# 打开/关闭控制台输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39535876/