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

Conditionally call a private method based on caller's debug configuration

我目前的代码情况是,我在程序集 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),这取决于我是处于 DEBUG 还是 RELEASE 模式,我希望在实例化类时创建调试消息:

var foo = new Foo();

如果我处于调试模式,我希望创建调试消息。 如果我处于发布模式,我不想创建调试消息。

我认为条件属性会比#iF DEBUG 语句更好。 This question 告诉我我错了!由于在运行时永远不会到达该方法。

此时我了解到“#iF Debug”和“[Conditional("DEBUG")]”语句无法实现我想要实现的目标。

因此我的问题是,如何让这个场景发挥作用?

该属性正常工作,请参阅 Conditional Compilation in Referenced Assemblies。该属性取决于 调用程序集 的编译符号。我测试并确认了这一点:[Conditional("DEBUG")] 的程序集中的方法,在 Release 上编译,只有在调用程序集在 Debug 中编译时才会被调用。如果您不是这种情况,则您的代码与您的描述不符。

你问题中的相关部分当然是"This method is called from the constructor."。该属性适用于 直接调用者 ,在您的情况下,它是包含 class 的构造函数,即 Release.

您必须做到 public 并显式调用方法:

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();