15

我有一个返回 IList 的 OR 映射器(iBatis.Net)。

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

我正在尝试在 Web 服务中使用它并希望以 1:1 的比例返回数据。当然,我不能在 WebMethod 中返回 IList,因为它是一个接口,因此不可序列化。

我发现映射器确实返回了一个列表。但是我害怕将它转换为 List 因为映射器的内部工作当然可能会在未来的版本中发生变化(而且感觉很脏)。

那我应该...

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

b) return (List<Something>)data;

c) // your solution here

非常感谢!

4

3 回答 3

16

如果它确实是,List<T>但您想防止更改并让它仍然有效,那么最高效的解决方案是尝试将其转换为列表,如果失败,则从其内容创建一个新列表,例如

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

但是,您提到不能返回接口,因为它是 Web 服务。对于 ASMX 和类,这可能是正确的XmlSerializer,但是如果您使用 WCF 构建 Web 服务并使用它,DataContractSerializer那么它将很高兴地序列化集合接口(作为服务的输入和输出)。不过,这种类型的变化可能比您想要的要大一些!

于 2009-01-21T09:28:26.507 回答
2

为什么要序列化 ​​IList :) 只需将其用作您自己的集合的源并对其进行序列化:

var data = mapper.QueryForList<T>(statement, parameters);
var yourList = new List<T>(data);
//Serialize yourList here ))
于 2009-01-21T09:19:02.627 回答
0

我认为你不需要交流)。使用解决方案 a) 应该是非常安全的。

该解决方案依赖于 IBatis.net 的公共 api。好的 api 不会改变他们的公共 api,除非它真的是解决关键任务问题的唯一解决方案

希望这可以帮助。

于 2009-01-21T09:17:04.157 回答