norbertB, да, решение a) является безопасным, но если IList содержит много элементов, оно будет медленным, а также ... b) должно быть самым быстрым, но не безопасным, поэтому мой вопрос для решения c).

я есть OR OR (iBatis.Net), который возвращает IList.

// IList<T> QueryForList<T>(string statementName, object parameterObject);
var data = mapper.QueryForList<Something>(statement, parameters);

Я пытаюсь использовать его в веб-сервисе хотят вернуть данные 1: 1. Конечно, я не могу вернуть IList в WebMethod, потому что это интерфейс и, следовательно, не сериализуемый.

Я обнаружил, что картограф действительно возвращает список. Но я боюсь привести его в список, потому что, конечно, внутренняя работа картографов может измениться в будущих версиях (и это просто кажется грязным).

Так я должен ...

a) return new List<Something>(data);

b) return (List<Something>)data;

c) // your solution here

Большое спасибо!

Ответы на вопрос(3)

) Просто используйте его как источник для вашей собственной коллекции и сериализуйте его:

var data = mapper.QueryForList<T>(statement, parameters);
var yourList = new List<T>(data);
//Serialize yourList here ))
 Hinek10 июн. 2010 г., 15:32
Потому что, если IList уже является списком, его можно использовать быстрее, чем закачивать элементы в новый список.

что вам нужно с). Это должно быть довольно безопасно использовать решение а).

Это решение зависит от общедоступного API IBatis.net. Хорошие API не меняют свои публичные API, если только это не единственное решение критически важной задачи.

Надеюсь это поможет.

 Luc Touraille21 янв. 2009 г., 10:52
Тот факт, что возвращенный IList является списком, не является частью общедоступного API; В этом весь смысл использования интерфейсов.
 norbertB21 янв. 2009 г., 12:53
Не то, что я сказал. возвращение ilist является частью общественного API
 Hinek04 июн. 2010 г., 13:57
norbertB, да, решение a) является безопасным, но если IList содержит много элементов, оно будет медленным, а также ... b) должно быть самым быстрым, но не безопасным, поэтому мой вопрос для решения c).
Решение Вопроса

Если это действительноList<T> но вы хотите защитить себя от изменений и сохранить их работу, тогда наиболее эффективным решением будет попытка преобразовать его в список, а в случае неудачи создайте новый список из его содержимого, например,

var data = mapper.QueryForList<T>(statement, parameters);
var list = data as List<T> ?? new List<T>(data);

Однако вы упоминаете, что не можете вернуть интерфейс, потому что это веб-сервис. Это могло быть верно с ASMX иXmlSerializer класс, но если вы создаете веб-сервис с использованием WCF и используетеDataContractSerializer тогда он будет успешно сериализовать интерфейсы сбора (как входные данные, так и выходные данные службы). Этот тип изменений может быть несколько больше, чем вы ожидаете!

 Hinek21 янв. 2009 г., 14:40
Спасибо! Для этого проекта я не буду переходить на WCF, но это полезно знать для дальнейшего использования. Также я только что узнал: я действительно люблю ?? синтаксис ;-)
 Matt Kocaj21 янв. 2009 г., 12:44
вау .. вот кул. я не знал, что ты сможешь это сделать вместе с WCF. раскачать!

Ваш ответ на вопрос