2011-01-19 10 views
5

Piszę usługę WCF dla operacji wstawiania i usuwania tutaj użyliśmy ogólnej metody, ale daje ona następujący błąd "System.Runtime.Serialization.InvalidDataContractException: Typ 'T' nie może być eksportowany jako schemat typ, ponieważ jest otwartym typem ogólnym. Można eksportować typ ogólny tylko wtedy, gdy wszystkie typy parametrów ogólnych są rzeczywistymi typami. "WCF ujawniające rodzaj ogólny "T"

tutaj „EntityBase2” jest klasą bazową dla wszystkich podmiotów

[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;   
} 

pytanie brzmi jak mogę wystawiać rodzajowe typu „T”?

+0

możliwy duplikat [WCF. Ogólne metody usług] (http://stackoverflow.com/questions/2906694/wcf-service-generic-methods) – decyclone

Odpowiedz

7

Myślę, że to jest imposible, w jaki sposób może wygenerować wsdl w ten sposób?

Masz dwie opcje:

  • Można wysłać typ jako parametr.

  • Jeśli chcesz ujawnić crud operacji dla podmiotów, polecam użyć generatora kodu, może szablon T4 dla EF.

+0

+1 @Pablo ma rację. Nie można używać rodzaju ogólnego. –

+0

Dziękuję Pablo Castilla – Vikram

6

Ten post jest rzeczywiście stary, ale może ktoś znaleźć to rozwiązanie przydatne: WCF and Generics

+0

Idealny. Pomogła znacząco! – Dann

+0

Pomocna wskazówka w tym artykule na temat usuwania Hash![DataContract (Name = "MyGenericObjectUsing {0}"] klasa publiczna MyGenericObject Daniel

1
  1. odpowiedź na to pytanie jest zarówno tak i nie Tak na serwerze dla potencjalnego klienta i nr prospektywnym.
  2. Możemy utworzyć ogólną umowę danych na serwerze, ale korzystając z niej w dowolnej umowie dotyczącej operacji, musimy określić typ danych generycznych.
  3. I na koniec klienta, że ​​umowa danych będzie narażona tylko jako silnie typ danych nie generycznych.

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

To jest to, co mamy na serwerze możemy zobaczyć podczas korzystania ogólny kontrakt danych, musimy określić typ inaczej będzie to dać błąd kompilacji czas.

Na kliencie, co otrzymujemy od WSDL jest kontynuacją:

[DataContract] 
public class MyGenericObjectOfint 

Widzimy tutaj, co otrzymujemy od WSDL nie jest rodzajowy kontrakt danych WSDL proxy wygenerować klasę z nową nazwą pomocą niektórych Konwencja.

Konwencja stosuje się

Generic Class Nazwa + „z” + Typ Nazwa parametru + Hash

Hash nie zawsze jest generowany, to będzie generowany tylko wtedy, gdy istnieje szansa kolizji z nazwy .