2011-01-19 7 views
5

삽입 및 삭제 작업을 위해 여기에 일반 메서드를 사용했지만 다음 오류가 발생했습니다. "System.Runtime.Serialization.InvalidDataContractException : 형식 'T'을 스키마로 내보낼 수 없습니다. 일반 제네릭 형식을 내보낼 수 있습니다. 모든 제네릭 매개 변수 형식이 실제 형식 인 경우에만 제네릭 형식을 내보낼 수 있습니다. " 여기 일반 형식 'T'를 노출하는 WCF

는 "EntityBase2는"

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

질문은 내가 제네릭 형식 'T'를 표시하는 방법을 모든 개체에 대한 기본 클래스입니다?

+0

[WCF. 서비스 제네릭 메소드] (http://stackoverflow.com/questions/2906694/wcf-service-generic-methods) – decyclone

답변

7

나는 그것이 불가능하다고 생각한다. 어떻게 wsdl을 그렇게 만들 수 있을까?

  • 당신은 매개 변수로 유형을 보낼 수 :

    당신은 두 가지 옵션이 있습니다.

  • 엔티티에 대한 crud 작업을 노출하려면 코드 생성기 (EF 용 T4 템플릿)를 사용하는 것이 좋습니다.

+0

+1 @ 파블로가 옳습니다. 제네릭 형식을 사용할 수 없습니다. –

+0

감사합니다 파블로 카스티 야 – Vikram

6

이 포스팅은 참으로 오래된,하지만 어쩌면 누군가가 도움이 솔루션을 찾을 수 : 잠재 고객에 대한 없음 서버 장래에 대해 예 아니오이 질문 예 모두 WCF and Generics

+0

완벽합니다. 크게 도움이되었습니다! – Dann

+0

해시를 제거하는 방법에 대한 도움말에서 유용한 정보![DataContract (Name = "MyGenericObjectUsing {0}"] 공용 클래스 MyGenericObject Daniel

1
  1. 대답을합니다.
  2. 서버에서 일반 데이터 계약을 만들 수 있지만 모든 계약에서 해당 계약을 사용하는 동안 일반 데이터 형식을 지정해야합니다.
  3. 그리고 클라이언트 측에서는 데이터 계약이 일반 데이터가 아닌 강력한 데이터 형식으로 만 노출됩니다.

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

이것은 우리가 그렇지 않으면 컴파일시 오류가주지 우리가 유형을 지정해야합니다 일반 데이터 계약을 사용하는 동안 우리가 볼 수있는 서버에있는 것입니다.

클라이언트에서

은 우리가 WSDL에서 얻을 것은 다음과 같습니다

[DataContract] 
public class MyGenericObjectOfint 

우리는 우리가 WSDL에서 얻을 것은 일반 데이터 계약 WSDL 프록시 일부를 사용하여 새 이름으로 클래스를 생성하지 여기 볼 수 있습니다 협약. 사용

협약은 + 이름 충돌의 가능성이있는 경우에만 + 유형 매개 변수 이름 + 해시 해시는 항상 생성되지 않습니다

, 그것은 생성됩니다 "의"

일반 클래스 이름입니다 .