3

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

具体来说,我有一个 Mailer 库,它使用模板来创建和发送电子邮件。因为我不想不小心用调试邮件向客户端发送垃圾邮件,所以我正在尝试制作我的SendMail方法的 2 个版本。

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

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

    [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参数或配置设置或类似的东西,但我更愿意这样做,而不必编辑此程序集之外的任何其他代码。

提前致谢。

4

2 回答 2

0

你不能这样做:

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

ETC?所以如果它的调试,你有 1 个带有附加代码的函数

或者

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

于 2012-09-12T11:46:51.700 回答
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 方法和对它的调用仅在调试模式下被编译和使用。

于 2012-09-12T11:57:13.573 回答