繁体   English   中英

在.NET / C#中克隆或使MailMessage不可变

[英]Clone or make a MailMessage Immutable in .NET / C#

我正在编写一个小型库,在其中编写一些接口,该接口接受一个MailMessage对象,并使用单个send方法返回一个类,该方法抽象出MailMessage的发送方式。 我可以控制实际发送的类,但不能控制实现策略的类。 我想防止任何实现策略类更改MailMessage。 如何使MailMessage(及其包含的集合)不可变或创建其副本? 我没有像在其他类上那样在MailMessage本身上看到.Clone方法。 我是否必须要重新建立一个新的MailMessage对象并对该新MailMessage进行逐个属性设置?

注意,我主要是Java的人,正在帮助客户使用C#2.0代码,因此对于这样的事情,我不太熟悉C#/ .NET惯用语。 任何帮助表示赞赏。

我认为没有快速的解决方案。 MailMessage具有继承的可变性,不能被克隆或序列化/反序列化。 如果需要确保没有人可以更改它,请不要缓存它,而是定义一个类,该类保存消息值的副本,并根据该实例创建新的MailMessage实例。

我知道这是一个老问题,但是最近我不得不执行此操作,所以这就是我所做的。 这是一个浅表克隆,尽管可以做更多的工作将其制成深表克隆。

        private MailMessage MM_ShallowClone(MailMessage original)
        {
            string to = original.To.ToString();
            string from = original.From.ToString();
            string subject = original.Subject;
            string body = original.Body;
            string cc = (original.CC == null) ? null : original.CC.ToString();
            string bcc = (original.Bcc == null) ? null : original.Bcc.ToString();

            MailMessage clone = new MailMessage(from, to, subject, body);
            if(cc != null) clone.CC.Add(cc);
            if(bcc !=  null) clone.Bcc.Add(bcc);

            foreach (AlternateView a in original.AlternateViews)
            {
                clone.AlternateViews.Add(a);
            }
            foreach(Attachment a in original.Attachments)
            {
                clone.Attachments.Add(a);
            }
            clone.BodyEncoding = original.BodyEncoding;
            clone.DeliveryNotificationOptions = original.DeliveryNotificationOptions;
            foreach (System.Collections.Specialized.NameValueCollection h in original.Headers)
            {
                clone.Headers.Add(h);
            }
            clone.HeadersEncoding = original.HeadersEncoding;
            clone.IsBodyHtml = original.IsBodyHtml;
            clone.Priority = original.Priority;
            clone.ReplyTo = original.ReplyTo;
            foreach (MailAddress a in original.ReplyToList)
            {
                clone.ReplyToList.Add(a);
            }
            clone.Sender = original.Sender;
            clone.SubjectEncoding = original.SubjectEncoding;

            return clone;             
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM