【问题标题】:Conditional method calling conditional method not working in C#条件方法调用条件方法在 C# 中不起作用
【发布时间】:2010-10-21 08:36:20
【问题描述】:

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

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

【问题讨论】:

  • 我完全按照您的方式构建了应用程序,并且一切正常;我无法重现您遇到的问题。
  • 也许二进制文件没有正确重建?您是否尝试过进行干净的构建?
  • 是的,我已经试过好几次了。当然,我的应用程序还有更多内容,读取 CSV,记录到文件等。我不明白它为什么调用 VerbosLog(...),但跳过了 VerboseLog() 正文中对 Log() 的调用。

标签: c# .net debugging logging conditional


【解决方案1】:

那里的条件不是颠倒的吗?即

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

【讨论】:

  • 不,我不这么认为。 OP 希望 Log 在两种情况下都发生,但 VerboseLog 仅在 VerboseLogging 条件下发生。
  • 不管怎样,他仍然定义了 VerboseLogging 和 Logging。
  • 杰夫耶茨是对的。两种情况下都应该出现日志,只有在定义了 VerboseLogging 时才会出现 VerboseLog。
  • @Josh G:是的,但这并没有什么坏处。即使我只定义 VerboseLogging,它仍然无法正常工作:(
  • msdn.microsoft.com/en-us/library/4xssyw96.aspx 有一些关于条件的逻辑与/或行为的信息,但是从我对该页面的阅读来看......你的例子应该是有效的
【解决方案2】:

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

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

【讨论】:

  • 感谢您测试代码!我到处复制“VerboseLogging”,仍然无法正常工作。奇怪的是,VerboseLog() 方法确实被调用了,但它没有在体内调用 Log()。它跳过它。
  • 啊,既然已经发布了真正的答案,我可以看到偷工减料并将所有类放在一个源文件中并不是测试这个问题的最明智的方法。生活和学习我猜...
【解决方案3】:

请注意,您还需要在您的Logger 文件中定义LoggingVerboseLogging,因为如果Logging 没有在那里定义,VerboseLog 将不会调用Log

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-10
    • 1970-01-01
    • 2020-12-12
    • 1970-01-01
    • 2018-04-22
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    相关资源
    最近更新 更多