我有一个返回IList的OR映射器(iBatis.Net)。
// IList<T> QueryForList<T>(string statementName, object parameterObject);
var data = mapper.QueryForList<Something>(statement, parameters);当然,我不能在WebMethod中返回IList,因为它是一个接口,因此不能序列化。
我发现映射器实际上返回了一个列表。但我不敢将其转换为列表,因为映射器的内部工作方式在未来的版本中可能会发生变化(而且它感觉很脏)。
所以我应该..。
a) return new List<Something>(data);
b) return (List<Something>)data;
c) // your solution here非常感谢!
发布于 2009-01-21 09:28:27
如果它真的是一个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-21 09:19:03
为什么要序列化IList :)只需使用它作为您自己的集合的源并序列化它:
var data = mapper.QueryForList<T>(statement, parameters);
var yourList = new List<T>(data);
//Serialize yourList here ))发布于 2009-01-21 09:17:04
我不认为你需要一个c)。使用解决方案a)应该是非常安全的。
该方案依赖于IBatis.net的公共接口。好的api不会更改它们的公共api,除非它确实是关键任务问题的唯一解决方案
希望这能有所帮助。
https://stackoverflow.com/questions/464525
复制相似问题