1

我正在尝试使用一些条件来增强我的 Logger 类,以控制要记录的内容和记录的位置。我有两种日志记录功能:

public static class Logger
{
    [Conditional("Logging"), Conditional("VerboseLogging")]
    public static void Log(string msg, string filename)
    {
        // log to file
    }

    [Conditional("VerboseLogging")]
    public static void VerboseLog(string msg, string filename)
    {
        Log(msg, filename); // just defer call to Log(string msg)
    }
}

但是,运行以下程序

#define Logging
#define VerboseLogging

static void Main(string[] args)
{
    Logger.Log("Logging", "");
    Logger.VerboseLog("VerboseLogging", "");
}

仅产生输出“Logging”,缺少“VerboseLogging”。

调试应用程序显示 VerboseLogging 确实被调用,但它没有调用Log(msg, filename). 调试器只是直接跳过函数调用到函数的末尾VerboseLog()

当我从Log(string msg)方法中删除条件时,它就起作用了。

有没有人知道为什么会发生这种情况或该怎么做才会被调用?

4

3 回答 3

3

Note that you need to define Logging and VerboseLogging in your Logger file also, because VerboseLog will not call Log if Logging is not defined there.

To add a project-wide conditional define, right click on your Project, and select Project Properties. Then go to the Build tab and enter "Logging, VerboseLogging" to the "Conditional compilation symbols" text box.

于 2009-04-23T13:24:59.617 回答
0

条件不是颠倒了吗?IE

[Conditional("Logging")]
public static void Log(string msg, string filename) { }

[Conditional("Logging"), Conditional("VerboseLogging")]
public static void VerboseLog(string msg, string filename) {
    Log(msg, filename); // just defers call to Log()
}
于 2009-04-23T12:49:51.730 回答
0

没有真正的帮助,但是您发布的代码在这里对我来说很好(.NET 3.5 SP1 控制台应用程序)。当然,我需要删除文件名参数,因为您在 main 中的调用不提供它,但除此之外,两个定义都给了我日志并删除了详细定义,只记录了“日志记录”。

将奥卡姆剃刀应用于问题:由于您发布的代码显然不是直接来自您的源(没有日志方法的主体和缺少的参数),您确定您在原始源中正确拼写了定义吗?除此之外,我不知道为什么它不适合你......

于 2009-04-23T13:13:06.447 回答