根据调用方的调试配置有条件地调用私有方法

本文关键字:调用 有条件 配置 有方法 调试 | 更新日期: 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();