在wcf客户端

时间:2016-02-03 22:31:16

标签: c# wcf object casting datacontract

我使用一个带有'object'类型属性的简单方法创建了一个WCF服务,因为此属性旨在与不同类型的对象一起使用,但是当我将该属性转换为另一个类型时,它会抛出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;

问题是我在客户端获得了无效的强制转换异常,因为result.Data内部是'object'类型而不是List,即使使用serviceKnowntype和knownType也是如此。

如何使这个演员成为可能?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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