Предположим, мы начинаем с нуля в 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
и KEY
как один и тот же ключ, и поэтому будет выбрасывать второй Add
.
К сожалению, когда все скомпилировано и запущено, мы получаем печальное лицо :(
, потому что, когда Dictionary
попадает на слой WCF, он «забывает», что он был сделан с определенным,не по умолчанию, Comparer
, и вместо этого получает string
s средство сравнения по умолчанию.
Существует ли простая настройка, которую можно изменить, чтобы сохранить свойство Comparer
Dictionary
как проходит по проводам?Или я должен создать собственный класс?
(я видел XML сериализацию словаря с пользовательским IEqualityComparer , но он не дал мне особого понимания.также видел этот комментарий к проекту от 3 лет назад , но это мой вопрос, а не ответ)