在调试模式下使用[Conditional("DEBUG")]时,参考程序集的备用方法

3
我正在尝试创建一个程序集方法,在调用程序集处于Debug配置时表现不同。
具体来说,我有一个Mailer库,使用模板创建和发送电子邮件。由于我不想意外地向客户发送调试邮件,我正在尝试制作两个版本的SendMail方法。
我的想法是,在Debug模式下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方法,因此此方法无法使用。

有没有一种方式可以使用相同的方法调用,使公共接口保持不变但仍然获得此功能? 我猜替代方案可能是使用可选的isDebug = false参数或配置设置或类似的东西,但我更喜欢在不编辑此程序集外的任何其他代码的情况下完成它。

提前致谢。


1
为什么不能依赖配置?如果您的环境之间默认的SMTP服务器配置不同,这应该足够了。 - Oded
是的,这可能是最好的方法,但条件属性似乎是最干净的解决方案(如果它确实有效)。我只是希望能够在不添加任何代码到其他项目的情况下完成调试。 - Guido Snackers
2个回答

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方法及其调用只会在调试模式下被编译和使用。


0

你能不能不这样做:

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

等等?那么你有一个带有额外代码的功能,如果它是调试状态

或者

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


1
我非常不喜欢这些预处理指令。它们经常会掩盖代码的调用情况,只有在切换到不同的配置时才会发现构建出现问题。 - Oded
我也尝试过这样做。在 #if DEBUG 之后的代码不会被编译到 DLL 中,而 Conditional 属性则会被编译,即使程序集是在发布模式下。 - Guido Snackers
@Oded - 在VS 2010及以上版本中,不会被编译的代码会变灰,那么它是如何掩盖哪些代码将被调用的呢? - Kevin
@Kevin 只要 build 在 Debug 配置中,它们可以被调用,但一旦切换到 Release 配置,该函数将被忽略。 - Guido Snackers
@BugFinder 条件属性检查调用者是否处于调试模式,只要我直接调用该方法,它就可以正常工作。 - Guido Snackers
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接