在 WCF 客户端中将“对象”类型属性强制转换为 knownType

本文关键字:属性 转换 knownType 类型 客户端 WCF 对象 | 更新日期: 2023-09-27 18:33:04

我使用一个简单的方法创建了一个 WCF 服务,其属性类型为"object",因为此属性旨在用于不同类型的对象,但是当我将该属性强制转换为另一种类型时,它会引发 invalidCastException。该服务如下所示:

[ServiceContract]
[ServiceKnownType(typeof(List<ItemDataContract>))]
public interface IService
{
    [OperationContract]
    ItemContainer GetList();
}
[DataContract]
[KnownType(typeof(List<ItemDataContract>))]
public class ItemContainer
{
    [DataMember]
    public object Data { get; set; }
}
[DataContract]
public class ItemDataContract
{
    [DataMember]
    public string Id { get; set; }
}

以及该方法的实现:

public ItemContainer GetList()
{
    return new ItemContainer
    {
        Data = new List<ItemDataContract> {new ItemDataContract{ Id = "1"}, new ItemDataContract{Id = "2"}
    };
}

在客户端,我调用了该方法:

Service1 _proxy = new Service1();
var result = _proxy.GetList();
return (List<ItemDataContract>)result.Data;

问题是我在客户端得到一个无效的强制转换异常,因为结果。内部数据的类型为"对象",而不是列表,即使使用serviceKnownType和knownType也是如此。

我如何使这种演员表成为可能?

在 WCF 客户端中将“对象”类型属性强制转换为 knownType

尝试强制转换对象类型需要花费太多时间,因此我最终创建了一个名为 Data 的新类,我在 IService1 接口中的所有其他类都继承自该类,并为 Data 属性分配了此类型。对于可枚举的类型,我专门为 de Data 类中的每个类型创建了一个属性。我确定不是最好的答案,但它可以使用已知类型与 ItemContainer。

你应该试试这个,希望这对你有帮助......

    Service1 _proxy = new Service1();
    List<ItemContainer> result = _proxy.GetList();
    return result.Data.ToList<datatype>();