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
を同じキーと見なし、2 番目の をスローするため、このコードは失敗することが予想されAdd
ます。
残念ながら、すべてがコンパイルされて実行されると、残念な顔:(
になります。これDictionary
は、WCF レイヤーに到達すると、特定の非デフォルトで作成されたことを「忘れ」、Comparer
代わりにstring
デフォルトの等値比較子を取得するためです。
ワイヤを通過するときにのComparer
プロパティが保持されるように変更する簡単な設定はありますか? Dictionary
または、カスタム クラスを作成する必要がありますか?
(カスタム IEqualityComparer を使用した Dictionary の XML シリアル化を見たことがありますが、あまり啓発されませんでした。3 年前のこの codeproject コメントも見ましたが、これは私の質問であり、回答ではありません)