Могут ли классы контрактов данных наследовать друг от друга? - PullRequest
0 голосов
/ 26 апреля 2011

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

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

Я пытаюсь добавить «[KnownType (typeof (C))]» к определению класса А - но это не работает.

[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; }
}

Ответы [ 2 ]

2 голосов
/ 26 апреля 2011
[DataContract]
[KnownType(typeof(B))]
[KnownType(typeof(C))]
public class A
{
 ...
}

 ...
1 голос
/ 26 апреля 2011

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

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