根据调用方的调试配置有条件地调用私有方法
本文关键字:调用 有条件 配置 有方法 调试 | 更新日期: 2023-09-27 18:36:50
我当前的代码情况是我在程序集 A 中有以下代码:
public class Foo
{
public Foo()
{
CreateDebugMessage();
}
[Conditional("DEBUG")]
[DebuggerStepThrough]
private void CreateDebugMessage()
{
AddMessageType(MessageType.Debug, "Debug",
"/Company.App.Class;component/Images/image.png", Brushes.Green, false);
}
}
一些额外的信息是我正在使用 MEF,并且此方法是从构造函数调用的。我有一个程序集 B(我正在导入程序集 A),根据我处于调试模式还是发布模式,我希望在实例化类时创建调试消息:
var foo = new Foo();
如果我处于调试模式,我希望创建调试消息。如果我处于发布模式,我不希望创建调试消息。
我认为条件属性会比 #iF DEBUG语句更好。这个问题告诉我我错了!因为在运行时永远不会达到该方法。
在这一点上,我明白"#iF 调试"和"[条件("调试")]"语句不会削减我想要实现的目标。
因此,我的问题是,如何使这种情况起作用?
该属性按预期工作,请参见引用程序集中的条件编译。该属性取决于调用程序集的编译符号。我测试并确认了这一点:在发布时编译的带有 [Conditional("DEBUG")]
的程序集中的方法只有在调用程序集在 Debug 中编译时才会被调用。如果不是这种情况,则您的代码与您的描述不匹配。
您问题中的相关部分当然是"此方法是从构造函数调用的"。该属性适用于直接调用方,在您的情况下,直接调用方是包含类的构造函数,即 Release。
您必须将其公开并显式调用该方法:
public class Foo
{
public Foo()
{
}
[Conditional("DEBUG")]
[DebuggerStepThrough]
public void CreateDebugMessage()
{
AddMessageType(MessageType.Debug, "Debug",
"/Company.App.Class;component/Images/image.png", Brushes.Green, false);
}
}
var foo = new Foo();
foo.CreateDebugMessage();