2014-12-03 8 views
-1

여러 WCF 서비스를 만들려고합니다. 그들은 List<BaseObjectType> 또는 IQueryable<baseObjectType>을 반환합니다.리플렉션을 사용하여 WCF에서 데이터를 가져 오는 방법

BaseObjectType 어떤 객체의 부모입니다 (같은 Person, Invoice, Document, .....) 그래서 WCF 서비스가 List<BaseObjectType>을 반환 할 수 있지만, 필요한 경우, 예를 List<Person>, List<Invoice> 등을 위해 반환 할 수 있습니다 ....

리플렉션을위한 SourceType 문자열 속성을 갖는 유니버설 그리드를 만들고 싶습니다.

List<T>으로 반사 및 채우기 모눈을 사용하여 WCF 서비스를 호출하는 메서드를 만들 수 있습니까?

답변

0

기본 계약의 각 하위 클래스에 대해 KnownTypes 특성을 사용하면 WCF는 계약을 올바르게 serialize하고 deserialize하는 방법을 알게됩니다. deserialized 형식이 올바른 형식이므로 클라이언트 측에서 반사가 실제로 필요하지는 않습니다.

참조하십시오 http://www.codeproject.com/Tips/601224/What-is-KnownType-Attribute-and

서비스 정의 클라이언트 코드에서

public void IService{ 
    List<BaseObject> GetObjects(); 
} 

[DataContract] 
[KnownTypes(typeof(DerivedObject))] 
public class BaseObject(){ 
    [DataMember] 
    public void string BaseProperty{get;set;} 
} 
public class DerivedObject:BaseObject(){ 
    [DataMember] 
    public void string DerivedProperty{get;set;} 
} 

var s = new Service(); 
var objects = s.GetObjects(); 
//objects can contain both DerivedObjects or BaseObjects 
0

제네릭은 이러한 방식으로 WCF에서 지원되지 않습니다. 클라이언트가 서버에 일반적인 인수를 전달하는 것이 좋을 수있는 몇 가지 시나리오를 발견했기 때문에 정말 좋을 것입니다. 불행하게도 OperationContract 정의에서 generic을 사용하면 WCF는 런타임에 WouldBeNiceButNotHappeningException을 발생시킵니다.

관련 문제