2014-12-03 27 views
-1

我想嘗試創建多個WCF服務。他們將返回List<BaseObjectType>IQueryable<baseObjectType>如何使用反射從WCF獲取數據

BaseObjectType對某些對象的父(如PersonInvoiceDocument,......) 所以WCF服務可以返回List<BaseObjectType>,但如果有必要,它可以返回例如List<Person>List<Invoice>等....

我想創建通用網格,它將具有用於反射的字符串屬性SourceType。

是否有可能創建方法,它將使用反射調用WCF服務並使用List<T>填充網格?

回答

0

對基礎合約的每個子類使用KnownTypes屬性,然後WCF將知道如何正確序列化和反序列化合約。因爲反序列化的類型是正確的類型,所以客戶端並不需要反射。

請參閱 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定義中使用泛型,WCF將在運行時引發WouldBeNiceButNotHappeningException。