假设我们在 Visual Studio 2010 中从头开始并添加一个“WCF 服务应用程序”。我们添加这个方法和实现:
// (in IService1.cs)
[OperationContract]
Dictionary<string, string> GetDictionary();
// (in Service1.svc.cs)
public Dictionary<string, string> GetDictionary()
{
return new Dictionary<string, string>(
StringComparer.InvariantCultureIgnoreCase);
}
然后我们向同一个解决方案添加一个新的“控制台应用程序”,向我们的服务项目添加一个服务引用(使用所有默认设置),并将此代码添加到Main
:
var c = new ServiceReference1.Service1Client();
var d = c.GetDictionary();
d.Add("key",string.Empty);
// Since this *should* be a case-insensitive dictionary,
// this add *should* fail
d.Add("KEY", string.Empty);
Console.WriteLine("Both Add()s succeeded :(");
Console.ReadKey();
我们预计这段代码会失败,因为不区分大小写的字典会将key
andKEY
视为同一个键,因此会抛出第二个Add
.
不幸的是,当所有东西都编译并运行时,我们会看到一张悲伤的脸:(
,因为当Dictionary
遇到 WCF 层时,它会“忘记”它是使用特定的、非默认的,Comparer
而是获取string
默认的相等比较器。
是否有一个简单的设置可以更改,以便在穿过电线时保留其Comparer
属性?Dictionary
或者我必须创建一个自定义类?
(我已经看到了带有自定义 IEqualityComparer 的 Dictionary 的 XML 序列化,但它并没有给我太多启发。我还看到了 3 年前的这个 codeproject 评论,但这是我的问题,而不是答案)