6

我正在以ArrayList. 在我的方法的 Web 服务声明中是这样的:

[WebMethod]
public int SaveSelectedOffers(ArrayList offers, int selectedRows)
{

}

在 Windows 窗体中,单击按钮,我的代码是:

private void offersAvailableSubmit_Click(object sender, EventArgs e)
{
    ArrayList options;
    options.Add("item 1");
    options.Add("item 2");
    options.Add("item 2");
    //In this line of code it is showing error that Argument 1: cannot convert from 'System.Collections.ArrayList' to 'object[]'
    int rowsAffected = serviceCaller.SaveSelectedOffers(options, rowCount); 
}
  1. 选项的数据类型是ArrayList并且在 Web 服务中我也使用ArrayList变量类型来保存这个值,那么为什么会出现这个错误呢?

  2. 将参数发送到 Web 服务是正确的方法还是有其他方法?

4

4 回答 4

8

Web 服务不能传递复杂的类型,例如ArrayList,或者至少在没有一些配置的情况下不能传递,所以只需简化您的 Web 服务。将其更改为:

public int SaveSelectedOffers(object[] offers, int selectedRows)

正如您所看到的,这就是它的生成方式,然后像这样调用它:

private void offersAvailableSubmit_Click(object sender, EventArgs e)
{
    object[] options = new object[3];
    options[0] = "item 1";
    options[1] = "item 2";
    options[2] = "item 2";

    int rowsAffected = serviceCaller.SaveSelectedOffers(options, rowCount); 
}

的初始化的另一个选项options,如果你正在寻找更简洁的东西,将是这样的:

object[] options = new object[] { "item 1", "item 2", "item 3" };
于 2013-03-18T11:58:46.917 回答
4

我建议你使用

[WebMethod]
public int SaveSelectedOffers(IList<string> offers, int selectedRows)
{

}

private void offersAvailableSubmit_Click(object sender, EventArgs e)
{
    IList<string> options = new List<string>();
    options.Add("item 1");
    options.Add("item 2");
    options.Add("item 2");

    int rowsAffected = serviceCaller.SaveSelectedOffers(options, rowCount); 
}

编辑#1

迈克尔说得好:

Web 服务不能传递像 ArrayList 这样的复杂类型,或者至少在没有一些配置的情况下不能传递,所以只需简化您的 Web 服务。- 迈克尔

编辑#2

使您的网络服务使用System.Collections.Generic.List

  1. 右键单击服务引用中的服务
  2. 配置服务参考
  3. 在数据类型组中
  4. 将集合类型更改为 System.Collections.Generic.List
于 2013-03-18T12:01:06.757 回答
2

忘记所有这些更改代码的废话。

如果您右键单击“服务引用”文件夹中的服务并从上下文菜单中选择“配置服务引用”,那么您可以指定客户端应将哪种类型用于集合。

在您的情况下,只需System.Collections.ArrayList从“集合类型”下拉列表中选择。

但是,您可以指定System.Collections.Generic.List并拥有强类型的通用列表。

于 2013-03-18T12:12:06.593 回答
0

我会在您的 Web 方法定义中使用类型化列表或数组。不可能有混淆。数组列表不是强类型的,这意味着直到运行时才能知道内容。

[WebMethod]
public int SaveSelectedOffers(string[] offers, int selectedRows)
{

}
于 2013-03-18T11:58:32.860 回答