WCF и IList из ISsomething

Мне интересно, как сделать этот объект доступным через WCF:

[DataContract]
public class A : IA
{
    [DataMember]
    public List<IB> ListOfB { get; set; } 
}

public interface IA
{
    List<IB> ListOfB { get; set; }
}

с IB интерфейсом класса B.

Сгенерированный XSD:

<xs:complexType name="A">
  <xs:sequence>
    <xs:element xmlns:q1="http://schemas.microsoft.com/2003/10/Serialization/Arrays" minOccurs="0" name="ListOfB" nillable="true" type="q1:ArrayOfanyType"/>
  </xs:sequence>
</xs:complexType>
<xs:element name="A" nillable="true" type="tns:A"/>
</xs:schema>

ArrayOfanyType -> Я чувствую, что это не может работать, так как IB нельзя пометить [DataContract].


person Francois    schedule 09.01.2013    source источник
comment
Это должно помочь: stackoverflow.com/a/4720963/870604   -  person ken2k    schedule 09.01.2013
comment
@ken2k +1, ты ответил на его вопрос раньше меня.   -  person Nick Ryan    schedule 09.01.2013


Ответы (1)


Чтобы сериализатор интерпретировал ваш контракт, они должны быть выражены в терминах конкретных типов, а не интерфейсов. Если вы измените свой код на это (и аннотируете класс B соответствующими атрибутами DataContract и DataMember, все будет хорошо.

[DataContract]
public class A
{
    [DataMember]
    public List<B> ListOfB { get; set; } 
}
person Nick Ryan    schedule 09.01.2013
comment
Конечно. Но мне все еще нужно, чтобы мой A имел список IB, а не IB напрямую (эти объекты являются общими, а A реализует IA, IA не должен знать B, а только IB... - person Francois; 09.01.2013
comment
@ФрансуаБ. Я понимаю, что ты этого хочешь, но ты не можешь этого сделать. Контракт должен основываться на конкретных типах. - person Nick Ryan; 09.01.2013