Sólo para exponer sobre la respuesta de Andrei y compartir mi experiencia, acabo de ir a través de un tema que, finalmente, decidí usar CollectionDataContract. Básicamente, con el fin de interactuar con un sistema específico, que quería ser capaz de enviar y recibir XML del formato:
<SomeMessageList>
<Message>
<ID>blah</ID>
<data1>blah</data1>
<data2>etc.etc.</data2>
</Message>
<Message>
<ID>blah</ID>
<data1>blah</data1>
<data2>etc.etc.</data2>
</Message>
//any number of repeated <Message> here
</SomeMessageList>
Sin embargo, si utiliza una matriz o un objeto de lista, la etiqueta raíz se llamó siempre ArrayOfMessage. Y si crease una clase que tuviera una matriz de objetos Message (digamos llamada MsgList), WCF agregaría eso como una etiqueta extra en la mezcla, de la cual no podría encontrar una forma de deshacerme. Por lo que habría parecido:
<SomeMessageList>
<MsgList>
<Message>
<ID>blah</ID>
<data1>blah</data1>
<data2>etc.etc.</data2>
</Message>
//any number of repeated <Message> here
</MsgList>
</SomeMessageList>
Así CollectionDataContract sólo me dio una forma sencilla de controlar el nombre del elemento de la lista raíz.
interesante .... – Seva
¡Gracias! Lo usé, pero también necesitaba llamar al constructor base para hacer que funcione la generación de la página de Ayuda, así que en su ejemplo reemplace: 'public Users() {}' con 'public Users(): base() {}'. –
@IanGrainger Algo más debe haber estado mal: el constructor base no arg se llama automáticamente si no se especifica lo contrario. – user2864740