如何使用反射从 WCF 获取数据

本文关键字:获取 数据 WCF 何使用 反射 | 更新日期: 2023-09-27 18:32:54

我想尝试创建多个 WCF 服务。他们会返回List<BaseObjectType>IQueryable<baseObjectType>.

BaseObjectType是某个对象的父对象(如PersonInvoiceDocument等)。所以WCF服务可以返回List<BaseObjectType>但是如果有必要,它可以返回例如List<Person>List<Invoice>等。

我想创建通用网格,它将具有用于反射的字符串属性 SourceType。

是否可以创建方法,该方法将使用反射调用 WCF 服务并用List<T>填充网格?

如何使用反射从 WCF 获取数据

对基本协定的每个子类使用 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

WCF 中不支持这种泛型。如果是这样,那就太好了,因为我遇到过一些让客户端将泛型参数传递给服务器会很棒的情况。遗憾的是,如果在 OperationContract 定义中使用泛型,WCF 会在运行时抛出 WillBeNiceButNotHappenException。