【发布时间】:2008-11-05 23:17:30
【问题描述】:
我正在尝试实现一个与 WCF 一起使用的字典。我的要求是:
- 实际(私有变量或基 class) 类型等价于 字典
- 比较器
=
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);
结果:
- 当我将 MyDictionary 作为 ParameterClass.Data.Value 元素之一传递时,我得到一个缺失的 KnownType 异常。
- 我可以安全地在 ResultClass 中返回 MyDictionary,但它不再是我的类型。它只是一个字典,不能转换为
MyDictionary。还有 comparer =System.Collections.Generic.GenericEqualityComparer<string>,不是我要找的不区分大小写的比较器。
我寻求的帮助是解决我失败的尝试,或者以一种完全不同的方式来实现我所陈述的要求。任何解决方案都不应涉及将一个字典复制到另一个字典。
谢谢
【问题讨论】:
-
NetDataContractAttribute 是一个可行的选择吗?也就是说,您是否能够保证在客户端和服务器端都可以使用具有 MyDictionary 类的相同程序集的副本?
-
感谢您回复我的帖子,但您尚未回答:我发布的代码是否适用于您的设置?还是抛出异常(或不带回数据)?
-
Marc - 我只对你的测试做了 1 次尝试。 clone.Data 抛出空值异常。感谢您的帮助,但 jezell 为我指明了正确的大方向。