【问题标题】:C# - WCF - Generics - [KnownType(typeof(xxx))]C# - WCF - 泛型 - [KnownType(typeof(xxx))]
【发布时间】:2012-01-11 04:07:55
【问题描述】:

我的客户端有 10 个表,它需要通过内部 WCF 加载到服务器。由于所有这些都是内部的,我可以使用我想要的任何技术编写客户端和服务器。

在客户端,我想使用 LINQ 将数据从表加载到 List、List 等...

在服务器上,我认为有一个 [DataContract] 如下:

[DataContract]
[KnownType(typeof(Table1))]
[KnownType(typeof(Table2))]
[KnownType(typeof(Table3))]
public class GenericType<T>
{
    [DataMember]
    public List<T> Data { get; set; }
}

然后在客户端添加代表匹配表的类。

[DataContract]
public class Table1
{
    [DataMember]
    public int UserID { get; set; }
    [DataMember]
    public string FullName { get; set; }
}

[DataContract]
public class Table2
{
    [DataMember]
    public int UserID { get; set; }
    [DataMember]
    public string Address1 { get; set; }
}

[DataContract]
public class Table3
{
    [DataMember]
    public string Name { get; set; }
    [DataMember]
    public string Description { get; set; }
}

当我创建客户端引用时,我没有得到服务器上声明的所有类,而且似乎只有 [DataContract] 上指定的第一个 [KnownType] 对客户端可见。

我的印象是 Generics 意味着允许多种类型,但 我认为 WCF 只能处理一个 [KnownType] x 类 是否正确?

如果是这样,我编写此代码的唯一方法是复制并粘贴 GenericType 类的 10 次,并在每次复制时更改 [KnownType] ??

因为如果这是唯一的解决方案,那么使用 Generic 而不是直接定义的 List,List 作为我的参数的真正好处是什么??

任何想法都会帮助我理清思路


出现问题是因为除非其中一个 WCF 方法使用任何声明为 [DataContract] 的 CLASSES ...似乎 WCF 不会将这些类带到客户端。

这是预期的情况吗?

【问题讨论】:

  • “我遇到了一个错误”。确切的错误是什么?另外KnownTypes“Table1”、“Table2”等也需要用[DataContract]和[DataMember]标记。
  • 我认为你错了,你可以在 msdn 上查看:msdn.microsoft.com/en-us/library/ms730167.aspx
  • @Erniel 即使我将 [DataContract] 和 [DataMember] 放在了客户端上,我仍然只能获得 Table1。
  • @PranayRana 我阅读了那个链接,但我仍然只得到第一个声明的类型,而不是其他类型......

标签: c# wcf generics


【解决方案1】:

您可以尝试将每个类的ServiceKnownType 属性归因于您的接口方法。

还有另一种选择,即在具有 CollectionDataContract 属性的类中实现通用列表:

[CollectionDataContract]
public class Table1Collection
   Inherits List<Table1>

在客户端,您可以编辑 Reference.svcmap 并枚举 CollectionMappings 部分中的每个集合:

<CollectionMappings>
  <CollectionMapping TypeName="My.Namespace.Table1Collection" Category="List" />

这允许您在管道的两端重用相同的代码。

【讨论】:

  • 如果我实现那个 [CollectionDataContract],这是否意味着我必须创建 10 个不同的类,每个类都指向不同的表?如果是这样,而不是有 10 个类直接实现 List ...等等,好处在哪里?
  • 只有在集合类中有业务逻辑并希望在客户端和服务器中重用此逻辑时,您才能从这种方法中获益。
  • @Developer:关于使用该类的 wcf 方法之一:我认为如果您使用我在回答中提到的 ServiceKnownType 属性,这将得到解决。
猜你喜欢
  • 2022-01-26
  • 1970-01-01
  • 2012-06-09
  • 1970-01-01
  • 2020-11-15
  • 1970-01-01
  • 1970-01-01
  • 2019-07-16
  • 1970-01-01
相关资源
最近更新 更多