2013-03-18 78 views
6

我以ArrayList的形式將數據從Windows窗體發送到Web服務。在我的方法的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服務還是有其他方法?

+0

在你的代碼中ArrayList選項;應該像ArrayList options = new ArrayList(); – Satpal 2013-03-18 12:01:24

回答

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" }; 
+2

_Very simple_配置:通過進入配置頁面並選擇通用列表類型意味着與像這樣的'癱瘓'相比的快樂世界。 – 2013-03-18 12:00:31

+1

@GrantThomas,就像真的那樣,使用原始類型似乎不太實際,以便其他平臺更有能力訪問您的服務?我想我是這麼想的,因爲在我的組織中,我們有MF,Java,.NET,C++,PHP,Perl以及任何其他可以跨組織部分操作的平臺。 – 2013-03-18 12:02:38

+0

你不是唯一一個'這樣想'的人,但你誤解了我。這樣的配置並不妨礙非.NET客戶端的一點:這是一個_client配置_。一些知識將複合想法和進步的情況。 – 2013-03-18 12:03:58

0

我會在你的web方法定義中使用一個類型化的列表或數組。沒有混淆可能。數組列表不是強類型的,這意味着直到運行時才能知道內容。

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

} 
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

爲了使您的Web服務使用System.Collections.Generic.List

  1. 右鍵點擊服務的服務引用
  2. 配置服務參考
  3. 數據類型組
  4. 將集合類型更改爲System.Collections.Generic.List
2

忘記所有這些改變你的代碼廢話。

如果右鍵單擊「Service References」文件夾中的服務,然後從上下文菜單中選擇「Configure Service Reference」,則可以指定客戶端應該使用哪種類型進行集合。

對於您的情況,只需從「收集類型」下拉列表中選擇System.Collections.ArrayList即可。

但是,您可以指定System.Collections.Generic.List並具有強類型的通用列表。

+0

:)沒有注意到有人發佈了這個;連接緩慢 :( – Tebo 2013-03-18 12:26:15

相關問題