Клонировать или сделать MailMessage неизменным в .NET / C # - PullRequest
2 голосов
/ 07 марта 2011

Я пишу небольшую библиотеку, в которой я пишу некоторые интерфейсы, которые принимают объект MailMessage и возвращают мне класс с помощью одного метода send, который абстрагирует от способа отправки этого MailMessage. У меня есть контроль над классом, который будет выполнять фактическую отправку, но я не могу контролировать классы реализации стратегии. Я бы хотел, чтобы любые реализующие классы стратегии не изменяли MailMessage. Как я могу сделать MailMessage (и содержащиеся в нем коллекции) неизменными или создать его клон? Я не вижу метод .Clone в самом MailMessage, как в других классах. Придется ли мне приводить к созданию нового объекта MailMessage и выполнению установки свойства за свойством в этом новом MailMessage?

Обратите внимание, я в основном парень по Java и помогаю клиенту с кодом C # 2.0, поэтому я немного незнаком с идиомами C # / .NET для таких вещей. Любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 07 марта 2011

Я не думаю, что есть быстрое решение для этого.MailMessage наследуемо изменчив и не предназначен для клонирования, сериализации / десериализации.Если вам нужно убедиться, что никто не может изменить его, не кэшируйте его, а определите класс, который хранит копию значений сообщения и создает из этого экземпляра новые MailMessage экземпляры.

0 голосов
/ 28 января 2013

Я знаю, что это старый вопрос, но недавно мне пришлось это реализовать, так что вот что я сделал. Это неглубокий клон, , хотя с небольшим количеством работы его можно превратить в глубокий клон.

        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;             
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...