如何在编译时根据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#不支持。如果我错过了什么,请让我知道。

如何在编译时根据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(...);

优点是可以在运行时在不同的实现之间切换。如DebugConsoleFileDatabase

您可以使用像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(...);