调用条件方法的条件方法在C#中不起作用

时间:2009-04-23 12:46:33

标签: c# .net debugging logging conditional

我正在尝试使用一些条件来增强我的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)方法中移除条件时,它可以正常工作。

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

3 个答案:

答案 0 :(得分:3)

请注意,您还需要在Logging文件中定义VerboseLoggingLogger ,因为如果VerboseLog Log将无法调用Logging那里没有定义。

要添加项目范围的条件定义,请右键单击您的项目,然后选择项目属性。然后转到Build选项卡,在“Conditional compilation symbols”文本框中输入“Logging,VerboseLogging”。

答案 1 :(得分:0)

条件不是倒挂吗?即。

[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()
}

答案 2 :(得分:0)

没有真正的帮助,但您发布的代码在我这里工作正常(.NET 3.5 SP1控制台应用程序)。当然我需要删除filename参数,因为你在main中的调用不提供它,但除了这两个定义给了我两个日志并删除详细定义只记录了“Logging”。

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