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

时间:2015-01-09 13:49:44

标签: c# mef

我当前的代码情况是我在程序集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模式,我希望在实例化类时创建Debug消息:

var foo = new Foo();

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

我认为Conditional属性会比#iF DEBUG语句更好。 This question向我展示了我的错误!因为在运行时从未达到该方法。

此时我理解" #iF Debug"和#34; [有条件的(" DEBUG")]"声明不会因为我想达到的目标而削减它。

因此,我的问题是,如何使这种情况有效?

1 个答案:

答案 0 :(得分:3)

该属性可以正常工作,请参阅Conditional Compilation in Referenced Assemblies。该属性取决于调用程序集的编译符号。我测试并证实了这一点:在Release上编译的[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();