#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 {...}