2009-07-20 45 views
2

支持傳遞給C#函數的可選數據的最佳方式是什麼?爲C#webmethod提供可選參數的最佳方法

我在.NET Web服務功能,定義了5個參數:

[WebMethod] 
    public string UploadFile(string wsURL 
     , byte[] incomingArray 
     , string FileName 
     , string RecordTypeName 
     , MetaData[] metaDataArray) 

這個函數的代碼是不是太長(但不平凡的任一),而且只有一個地方的功能,其中我進行該測試是否有任何元數據[]待處理:

 if (metaDataArray.Length > 0) 
     { 
      Update update = BuildMetaData(metaDataArray); 
      treq2.Items = new Operation[] { sru, cin, update, fetch}; 
     } 
     else 
     { 
      treq2.Items = new Operation[] { sru, cin, fetch}; 
     } 

我所需的高於其只需要4個參數(即,沒有「元數據」陣列作爲最後一個參數)的一個快速和骯髒的版本,所以我克隆了整個函數,並刪除了引用met的IF-ELSE塊ADATA。醜陋的我知道。

[WebMethod] 
    public string UploadFileBasic(string wsURL 
     , byte[] incomingArray 
     , string FileName 
     , string RecordTypeName) 

現在我想做的事情更好,我正在尋找建議,以支持這一點的最佳方式。我不想讓客戶端程序創建一個空數組作爲第5個參數......我希望我的Web服務功能足夠聰明,可以處理這些可選數據。謝謝。

回答

7

改變你的檢查方法,需要5個參數(注意,你應該檢查值是否爲空)。

if (metaDataArray != null && metaDataArray.Length > 0) 
    { 
     Update update = BuildMetaData(metaDataArray); 
     treq2.Items = new Operation[] { sru, cin, update, fetch }; 
    } 
    else 
    { 
     treq2.Items = new Operation[] { sru, cin, fetch}; 
    } 

然後,只需有你的4參數版本內部調用5參數版本與metaDataArray參數無效。

[WebMethod] 
public string UploadFileBasic(string wsURL, 
           byte[] incomingArray, 
           string FileName, 
           string RecordTypeName) 
{ 
    return UploadFile(wsUrl, incomingArray, fileName, RecordTypeName, null); 
} 
+0

+1,因爲儘管事實上我的回答非常適合他現有的代碼,但這是我在自己的代碼中使用的方法。 – 2009-07-20 20:44:32

3
private static readonly MetaData[] EmptyMetaData = new MetaData[0]; 

[WebMethod] 
public string UploadFile(string wsURL 
    , byte[] incomingArray 
    , string fileName 
    , string recordTypeName) 
{ 
    return UploadFile(wsURL, incomingArray, fileName, recordTypeName, EmptyMetaData) 
} 
0
[WebMethod] 
    public string UploadFileBasic(string wsURL 
     , byte[] incomingArray 
     , string FileName 
     , string RecordTypeName) 
{ 
    return UploadFile(wsURL, incomingArray, FileName, RecordTypeName, new MetaData[0]); 
} 

然後UploadFile方法處理一切,但你能根據消費者想要什麼,露出兩個接口。

+0

。他想避免對象創建開銷(這可能ISN」噸甚至可衡量)。因爲0長度的數組是非常不變的,所以爲這個作業包含一個「private static readonly」類成員是很容易的。 – 2009-07-20 20:42:43

+0

@ 280Z28 OP說:「我不想讓客戶端程序創建一個空數組作爲第5個參數」,這不會給客戶端/應用程序帶來負擔。 – 2009-07-20 20:54:49

2

如何把所有的參數,包括元數據陣列成一個類,並用它作爲參數傳遞給Web服務:

public class UploadFileAgrument 
{ 
    public string wsURL; 
    public byte[] incomingArray; 
    public string FileName; 
    public string RecordTypeName; 
    public MetaData[] metaDataArray; 
} 

[WebMethod] 
public string UploadFile(UploadFileAgrument fileToUpload) 
{ 
    if(fileToUpload.metaDataArray!=null && metaDataArray.Length > 0) 
    { 
    } 
    else 
    { 
    } 
} 
相關問題