如何根据C#中的标志在编译时更改代码

时间:2014-08-13 18:43:05

标签: c# debugging conditional-compilation visual-studio-macros

我想设置一个调试标志,以便用“Log”.WriteLine替换“Console”.Writeline。 我不想写

if (debug)
    Log.writeline("log");
else 
    Console.Writeline("log"); every time I want to log info.

类似于INFO.Writelline("log");的东西,其中INFO可以由“Log”或“Console”替换,具体取决于全局变量集。
本来会使用条件宏,但C#不支持。 如果我遗失了什么,请告诉我。

4 个答案:

答案 0 :(得分:4)

你有没有试过这样的事情:

 #if (DEBUG)
      Log.writeline("log");
 #else
     Console.Writeline("log");
 #endif

答案 1 :(得分:3)

这样的东西?

#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");

答案 2 :(得分:3)

不直接回答您的问题。但您可以添加自己的界面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等等。

答案 3 :(得分:2)

您可以使用Log4Net之类的库并设置不同的 appenders ,一个用于控制台,另一个用于记录到文件/ sql服务器等。

<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(...);