我正在尝试使用一些条件来增强我的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)
方法中移除条件时,它可以正常工作。
是否有人知道为什么会发生这种情况或者该怎么做才会被调用?
答案 0 :(得分:3)
请注意,您还需要在Logging
文件中定义VerboseLogging
和Logger
,因为如果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的剃刀应用于问题:由于您发布的代码显然不是来自您的源代码(没有日志方法的主体和缺少的参数),您确定您拼写了在原始来源中正确定义?除此之外我不知道为什么它不适合你...