将动态参数列表传递给 Web 服务
使与 Web 服务的交互更简单、更易于维护
我正在开发一个 Silverlight 3 项目,需要通过 Web 服务连接到数据库。此 Web 服务的一个方面是,它有一个通用的方法,该方法接受要执行的存储过程的名称,以及一个或多个各种类型的参数。在弄清楚我的不太优雅的解决方案的过程中,我学到了一些东西:0) Silverlight 不支持
Serialize
属性。 1) Web 服务方法不能接受泛型对象列表(显然也不能接受 object
对象数组)。 经过几天的尝试,我得出了以下解决方案。简而言之,我在客户端创建了一个 xml 字符串,并在 Web 服务中对其进行解析。为了转换为 xml 字符串,我做了以下操作//-------------------------------------------------------------------------------- public static XElement MakeXmlParameter(string name, object value) { XElement element = new XElement("Parameter", new XElement("Name", name), new XElement("Type", value.GetType()), new XElement("Value", value)); return element; }在服务中,我拥有此方法
public class Parameters :List<SqlParameter> { } //------------------------------------------------------------------------------------- private Parameters MakeSqlParameters(string xmlData) { Parameters parameters = null; if (string.IsNullOrEmpty(xmlData)) { XDocument xDoc = XDocument.Parse(xmlData); XElement root = xDoc.Element("Parameters"); if (root.HasElements) { parameters = new Parameters(); IEnumerable考虑到项目架构,可能还有更好的方法,但我需要快速地让一些东西正常工作。 额外好处 - 请注意对children = (from item in root.Elements() select item); foreach (XElement value in children) { string paramName = value.Element("Name").Value; string typeName = value.Element("Type").Value; object obj = Convert.ChangeType(value.Element("Value").Value, Type.GetType(typeName)); SqlParameter parameter = new SqlParameter(paramName, obj); parameters.Add(parameter); } } } return parameters; }
Convert.ChangeType
方法的调用,我在 Google 上搜索了几个小时才发现你可以这样转换为命名类型。看看我为你节省了多少 Google 搜索时间! :) 编辑=========================== 你可以通过简单地在循环遍历所有子元素之前检索第一个元素来使 MakeSqlParameters()
方法更通用。 这样,无论他们如何命名根节点,都无关紧要。