Могут ли классы контрактов данных наследовать друг от друга?

#wcf

#wcf

Вопрос:

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

Но в случае, если я хочу наследовать между более чем двумя классами .. допустим, у меня также есть класс C, который наследуется от класса A — как я могу это сделать?

Я пытаюсь добавить ‘ [KnownType(typeof(C))]’ к определению класса A — но это не работает.

 [DataContract]
[KnownType(typeof(B))]
public class A
{
   [DataMember]
   public string Value { get; set; }
}

[DataContract]
public class B : A
{
   [DataMember]
   public string OtherValue { get; set; }
}

[DataContract]
public class C : A
{
   [DataMember]
   public string OtherValue { get; set; }
}
  

Ответ №1:

 [DataContract]
[KnownType(typeof(B))]
[KnownType(typeof(C))]
public class A
{
 ...
}

 ...
  

Ответ №2:

Я бы подумал, что вы захотите ;

 [KnownType(typeof(A))]
public class B : A
{
...
}
  

поскольку B «является» A (для всех намерений и задач сериализации WCF). Однако, как вы поняли в данный момент, вы говорите, что A «является» B, что не всегда так (т. Е. typeof C), но при дальнейшем исследовании….Я был бы неправ.

Я несколько раз сталкивался с примером Person: Contact, и я просто подумал, что поищу его, чтобы убедиться, что мое понимание было правильным, и эта ссылка показывает синтаксис так же, как и у вас (примечания к базовому классу). Это показывает стекирование следующим образом;

    1. [DataContract]
   2. [KnownType(typeof(Customer))]
   3. [KnownType(typeof(Person))]
   4. class Contact {...}
   5.  
   6. [DataContract]
   7. class Person : Contact {...}