2009-07-20 42 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 
    { 
    } 
} 
相关问题