2012-05-08 17 views
8

tengo una clase C# define de la siguiente manera:Serialize Tipo genérico sobre Servicio WCF

public class GenericItem<T> 
{ 
    public List<T> Items { get; set; } 

    public DateTime TimeStamp { get; set; } 
} 

Estoy creando una instancia de esta clase en mi servidor. entonces yo estoy tratando de pasarlo sobre el alambre a través de un servicio WCF como se muestra aquí:

[OperationContract] 
public GenericItem<MyCustomType> GetResult() 
{ 
    GenericItem<MyCustomType> result = BuildGenericItem(); 
    return result; 
} 

Todo compila muy bien en este momento. Cuando "referencia de servicio de actualización" en mi Silverlight APP un re-compilación, recibo un error en tiempo de compilación, similar a la siguiente:

MyNamespace.GenericItemOfMyCustomType [caracteres adicionales] no contiene una definición pública de 'GetEnumerator '

no tengo ni idea de por qué:

  1. caracteres adicionales están apareciendo. Parece que cambian cada vez que actualizo la referencia del servicio.
  2. Cómo solucionar esto.

¿Qué estoy haciendo mal?

Respuesta

7

Sleiman es correcta, pero se puede utilizar acotada genéricos como se describe en this article, y usted puede ser capaz de lograr lo que quiere. Esto le permite crear un tipo genérico dentro del servicio y exponerlo. Pero el consumidor no lo verá como genérico ya que el tipo se especifica en la operación del servicio.

5

No puede definir contratos de WCF que se basan en parámetros de tipo genérico. Los genéricos son específicos de .NET, y su uso violaría la naturaleza orientada a los servicios de WCF. Sin embargo, un contrato de datos puede incluir una colección como miembro de datos porque WCF ofrece reglas dedicadas de recopilación de datos para las colecciones.

-3

Usted puede usar la siguiente en el cliente en lugar de utilizar el ServiceReference:

var myBinding = new BasicHttpBinding(); 
var myEndpoint = new EndpointAddress(""); 
var myChannelFactory = new ChannelFactory<IService>(myBinding, myEndpoint); 
IService gks = myChannelFactory.CreateChannel(); 

Obras para los genéricos.

+0

esto no está ni remotamente relacionado con la pregunta en cuestión. – Seabizkit