2011-01-19 15 views
5

Escribo un servicio WCF para Insertar y eliminar operación aquí usamos el método genérico pero da el siguiente error "System.Runtime.Serialization.InvalidDataContractException: El tipo 'T' no se puede exportar como un esquema escriba porque es un tipo genérico abierto. Solo puede exportar un tipo genérico si todos sus tipos de parámetros genéricos son tipos reales. "WCF exponiendo el tipo genérico 'T'

aquí "EntityBase2" es la clase base para todas las entidades

[ServiceContract] 
[ServiceKnownType(typeof(EntityBase2))] 
public interface IBackupUtility 
{ 
    [OperationContract] 
    void Delete<T>(T entity) where T : EntityBase2; 

    [OperationContract] 
    void InsertORUpdate<T>(T entity) where T : EntityBase2;   
} 

pregunta es cómo puedo exponer tipo genérico de 'T'?

+0

posible duplicado de [WCF. Servicio de métodos genéricos] (http://stackoverflow.com/questions/2906694/wcf-service-generic-methods) – decyclone

Respuesta

7

Creo que es imposible, ¿cómo podría generar el wsdl de esa manera?

Usted tiene dos opciones:

  • usted podría enviar el tipo como un parámetro.

  • Si desea exponer las operaciones crud para las entidades, le recomendaría utilizar un generador de código, tal vez una plantilla T4 para EF.

+0

+1 @Pablo tiene razón. No puedes usar el tipo genérico. –

+0

Gracias Pablo Castilla – Vikram

6

Este post es viejo por cierto, pero tal vez alguien encontró esta solución útil: WCF and Generics

+0

Perfecto. ¡Ayudó significativamente! – Dann

+0

Consejo útil en ese artículo sobre cómo eliminar el hash![DataContract (Name = "MyGenericObjectUsing {0}"] clase pública MyGenericObject Daniel

1
  1. respuesta a esta pregunta es sí y No. Sí para el servidor prospectivo y no para el cliente potencial.
  2. Podemos crear un contrato de datos genérico en el servidor, pero al usarlo en cualquier contrato de operación, debemos especificar un tipo de datos del genérico.
  3. Y al final del cliente ese contrato de datos será expuesto solo como un tipo de datos fuertemente no genérico.

    [DataContract] 
    public class MyGenericObject<T> 
    { 
        private T _id; 
    
        [DataMember] 
        public T ID 
        { 
         get { return _id; } 
         set { _id = value; } 
        } 
    } 
    
    [OperationContract] 
    MyGenericObject<int> GetGenericObject(); 
    

Esto es lo que tenemos en el servidor podemos ver durante el uso de contrato de datos genéricos que tenemos que especificar el tipo de lo contrario dará error de compilación tiempo.

El cliente lo que obtenemos a partir de WSDL es una continuación:

[DataContract] 
public class MyGenericObjectOfint 

Podemos ver aquí lo que obtenemos a partir de WSDL no es un contrato de datos proxy WSDL genérica generar una clase con un nuevo nombre con alguna convención. Convención

utilizado es

Genérico Nombre de clase + "de" + Tipo Nombre del parámetro + Hash

Hash no siempre se genera, ésta se forma sólo cuando existe la posibilidad de colisión de nombres .

Cuestiones relacionadas