【问题标题】:cast 'object' type property to knownType in wcf client在 wcf 客户端中将“对象”类型属性强制转换为 knownType
【发布时间】:2016-02-05 19:14:02
【问题描述】:

我用一个简单的方法创建了一个 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 内部是“对象”类型而不是列表,即使使用 serviceKnowntype 和 knownType。

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

【问题讨论】:

  • 是否可以选择使 ItemContainer 通用并仅指定每个操作的类型?
  • yes 标记,但是在实现中,每种要使用的对象类型都会有不同的 ItemContainer,从而导致服务参考中的每个对象都有不同的类型客户端。
  • 好吧,这将是我个人的偏好,因为否则客户需要知道服务的确切实施细节才能进行正确的转换。至于手头的问题,您可以尝试(不知道它是否可行)将数据和服务合同放在客户端和服务都引用的程序集中。当您导入服务引用时,它将引用来自共享程序集的服务引用。也许演员阵容会起作用。否则可能没有足够的类型信息让运行时知道它们是同一个类。

标签: c# wcf object casting datacontract


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 试过但没用,c#不允许对象类型使用ToList方法
    • 你正在使用 var tahts 为什么你不能使用 Tolist 方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    • 1970-01-01
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多