如何通过WCF实现继承的Dictionary

chi*_*emp 7 c# wcf c#-3.0

我正在尝试实现一个用于WCF的字典.我的要求是:

  • 实际(私有变量或基类)类型等同于Dictionary
  • Comparer = System.StringComparer.InvariantCultureIgnoreCase
  • 自定义(覆盖/新)添加(键,值)方法(包括验证).
  • 覆盖ToString()
  • 在客户端和主机上使用相同类型

我试图在WCF主机和客户端项目共享的公共项目中使用此类:

[Serializable]
public class MyDictionary : Dictionary<string, object>
{
  public MyDictionary()
    : base(System.StringComparer.InvariantCultureIgnoreCase)
  { }

  public new void Add(string key, object value)
  { /* blah */ }

  public override string ToString()
  { /* blah */ }
}

[DataContract]
[KnownType(typeof(MyDictionary))]
[KnownType(typeof(object[]))]
[KnownType(typeof(double[]))]
[KnownType(typeof(string[]))]
[KnownType(typeof(DateTime[]))]
public class ResultClass
{
  public object Value{ get; set; }
  /* More properties */
}
public class ParmData
{
  public object Value{ get; set; }
  /* More properties */
}
[DataContract]
[KnownType(typeof(MyDictionary))]
[KnownType(typeof(object[]))]
[KnownType(typeof(double[]))]
[KnownType(typeof(string[]))]
[KnownType(typeof(DateTime[]))]
public class ParameterClass
{
  public List<ParmData> Data{ get; set; }
  /* More properties */
}

[OperationContract]
ResultClass DoSomething(ParameterClass args);
Run Code Online (Sandbox Code Playgroud)

结果:

  • 当我将MyDictionary作为ParameterClass.Data.Value元素之一传递时,我得到了一个缺少的KnownType异常.
  • 我可以安全地在ResultClass中返回MyDictionary,但它不再是我的类型.它只是一个字典,不能转换为MyDictionary.还比较= System.Collections.Generic.GenericEqualityComparer<string>,而不是我正在寻找的不区分大小写的比较器.

我要求的帮助是要么修复我失败的尝试,要么是完全不同的方式来达到我声明的要求.任何解决方案都不应涉及将一个字典复制到另一个

谢谢

jez*_*ell 10

将CollectionDataContract添加到Dictionary类:

有关使用集合数据协定实现字典的更多信息,请查看以下链接:

http://msdn.microsoft.com/en-us/library/aa347850.aspx


chi*_*emp 1

  • CollectionDataContract按照 jezell 建议使用该属性
  • 使用 /collectionType 参数,通过 SvcUtil 手动生成参考(代理)代码。vs2008 服务参考 GUI 不支持此参数。

来源:WCF集合类型共享

  • 如果解决方案是由其他用户提供的,为什么您接受自己的答案? (2认同)