如何在编译时根据c#中的标志修改代码
本文关键字:标志 修改 代码 编译 | 更新日期: 2023-09-27 18:17:57
我想设置一个调试标志,这样就可以取代"Console"。Writeline with"Log"。我不想写
if (debug)
Log.writeline("log");
else
Console.Writeline("log"); every time I want to log info.
类似INFO.Writelline("log");
, INFO可以被"Log"或"Console"替换,这取决于全局变量集。
应该使用条件宏,但c#不支持。如果我错过了什么,请让我知道。
像这样?
#define MY_DEBUG //Note: this must be the first line in the file
public static class INFO
{
public static void WriteLine(string message)
{
#if (MY_DEBUG)
Log.writeline(message);
#else
Console.Writeline(message);
#endif
}
}
调用
INFO.WriteLine("log message");
你试过这样做吗?
#if (DEBUG)
Log.writeline("log");
#else
Console.Writeline("log");
#endif
没有直接回答你的问题。但是,您可以添加自己的接口ILog
,并避免if(debug)
条件无处不在。
public interface ILog
{
void WriteLine(string message);
}
然后像
那样实现它public class LogImpl : ILog
{
public void WriteLine(string message)
{
Log.WriteLine(...);
}
}
public class DebugImpl : ILog
{
public void WriteLine(string message)
{
Debug.WriteLine(...);
}
}
那么为了方便起见,你可以有一个静态类来提供这个实例。
public static class Logger
{
public static ILog Instance = new DebugImpl();//Or LogImpl
}
那么你可以直接写
Logger.Instance.WriteLine(...);
优点是可以在运行时在不同的实现之间切换。如Debug
、Console
、File
、Database
等
您可以使用像Log4Net这样的库并设置不同的appender ,一个用于控制台,一个用于记录文件/sql server等。
<log4net>
<appender name="FileAppender" type="log4net.Appender.FileAppender">
<file value="log-file-1.txt" />
<appendToFile value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %message%newline" />
</layout>
</appender>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="FileAppender" />
<appender-ref ref="ConsoleAppender" />
</root>
</log4net>
通过这样做,您将看到它在本地运行时记录到控制台,在生产环境中运行时也将记录到文件,这将在同一行完成…
log.info(...);