使用[Conditional(“DEBUG”)在调试模式下引用程序集中的备用方法]

时间:2012-09-12 11:41:58

标签: c# .net debugging

我试图在一个程序集中创建一个方法,当调用程序集处于Debug配置时,该方法的行为会有所不同。

具体来说,我有一个Mailer库,它使用模板来创建和发送电子邮件。由于我不想用调试邮件意外地垃圾邮件客户端,我正在尝试制作我的SendMail方法的两个版本。

这个想法是在调试模式下MailMessage.Recipients将被清除,并且将使用默认的邮件地址(即我们自己的内部邮件地址)。我希望这一点尽可能透明,而不需要在主叫方面提供额外的代码或配置。

问题是Mailer库内置于Nuget包中,因此始终处于Release版本中。 我想做这样的事情:

    [System.Diagnostics.Conditional("DEBUG")]
    private void SetDebugMode(MailMessage mail)
    {
        mail.To.Clear();
        mail.CC.Clear();
        mail.Bcc.Clear();

        mail.To.Add("support@example.com");
        mail.Subject += " [DEBUG]";
    }

    public void SendMail()
    {
        SmtpClient smtp = new SmtpClient();
        using (MailMessage mail = new MailMessage())
        {
            [...]
            SetDebugMode(mail);
            smtp.Send(mail);
        }
    }

这不起作用,因为调用方法是SendMail方法,它处于Release配置中。

有没有办法使用相同的方法调用,所以公共接口保持不变但仍然获得此功能? 我想替代方案是使用可选的isDebug = false参数或配置设置或类似的东西,但我更愿意这样做,而无需编辑此程序集之外的任何其他代码。

提前致谢。

2 个答案:

答案 0 :(得分:0)

你能不能这样做:

#if DEBUG
  Mail.Subject += " [Debug]";
#endif

等?因此,如果调试

,则有1个附加代码的函数

if(System.Diagnostics.Debugger.IsAttached)Mail.Subject + =“[DEBUG]”;

答案 1 :(得分:0)

这样的事情怎么样......

    #if DEBUG
    private void SetDebugMode(MailMessage mail) {
        mail.To.Clear();
        mail.CC.Clear();
        mail.Bcc.Clear();
        mail.To.Add("support@example.com");
        mail.Subject += " [DEBUG]"; }
    #endif

    public void SendMail() {
        SmtpClient smtp = new SmtpClient();
        using (MailMessage mail = new MailMessage()) {
        [...]
        #if DEBUG
        SetDebugMode(mail);
        #endif
        smtp.Send(mail); } }

这样SetDebugMode方法和对它的调用只能在调试模式下编译和使用。