我有一个返回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。但是我害怕将其转换为List,因为当然mappers的内部工作方式可能会在未来的版本中发生变化(而且感觉很脏)。
我应该......
a) return new List<Something>(data);
b) return (List<Something>)data;
c) // your solution here
非常感谢!
答案 0 :(得分: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
,那么它将很乐意序列化集合接口(作为服务的输入和输出) )。这种变化可能比你想要的要大一些!
答案 1 :(得分:2)
为什么要序列化IList :)只需将它用作您自己的集合的源代码并将其序列化:
var data = mapper.QueryForList<T>(statement, parameters);
var yourList = new List<T>(data);
//Serialize yourList here ))
答案 2 :(得分:0)
我认为你不需要c)。 使用解决方案a)应该是非常安全的。
此解决方案取决于IBatis.net的公共API。好的api不会改变他们的公共api,除非它真的是解决任务关键问题的唯一解决方案
希望这有帮助。