Как наследовать от класса, который не помечен DataContractAttribute или SerializableAttribute в WCF? - PullRequest
4 голосов
/ 15 декабря 2010

В WCF как наследовать от класса, который не помечен DataContractAttribute или SerializableAttribute, и использовать его в качестве datacontract?

Пример: у меня есть пользовательский класс с именем "EmailAttachment", который я унаследовал от System.Net.Mail.Attachment:

[DataContract]
public class EmailAttachment : Attachment
{
   [DataMember]
   public string AttachmentURL
   {
       set;
       get;
   }
   [DataMember]
   public string DisplayName
   {
       set;
       get;
   }
}

Но когда я публикую сервис, он выдает ошибку времени выполнения, говорящую, что:

System.Runtime.Serialization.InvalidDataContractException: Тип 'EmailAttachment'не может наследоваться от типа, который не помечен как DataContractAttribute или SerializableAttribute.

Какой обходной путь для этого?

1 Ответ

0 голосов
/ 15 декабря 2010

Это зависит от того, как вы хотите, чтобы ваш контракт данных выглядел.Разве вы не можете использовать оболочку, а не производный класс?Что-то вроде:

[DataContract]
public class EmailAttachment
{
   public EmailAttachment(){}

   internal EmailAttachment(Attachment inner) {_attachment = inner;}

   [DataMember]
   public string AttachmentURL
   {
       set;
       get;
   }
   [DataMember]
   public string DisplayName
   {
       set;
       get;
   }

   private Attachment  _attachment;
}

Если из внутреннего System.Mail.Attachment есть какое-либо состояние, которое вы хотите отобразить в контракте данных, вы бы добавили свойства DataMember для отображения этого.

...