【问题标题】:Best way of making an argument optional for a C# webmethod使 C# webmethod 的参数可选的最佳方法
【发布时间】:2009-07-20 20:37:01
【问题描述】:

支持传递给 C# 函数的可选数据的最佳方式是什么?

我在 .Net 中有网络服务功能,它定义了 5 个参数:

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

这个函数的代码不会太长(但也不是微不足道的),如果有任何MetaData[]要处理,我在函数中只有一个地方执行这个测试:

        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 个参数(即没有“元数据”数组作为最终参数),所以我克隆了整个函数并删除了引用元数据的 IF-ELSE 块。丑我知道。

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

现在我想把事情做得更好,我正在寻找支持这一点的最佳方式的建议。我不想通过创建一个空数组作为第 5 个参数来增加客户端程序的负担……我想让我的 Web 服务函数足够智能以处理这些可选数据。谢谢。

【问题讨论】:

    标签: c# visual-studio arrays arguments overloading


    【解决方案1】:

    将您的检查更改为接受 5 个参数的方法(注意,您应该检查该值是否为 null)。

        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 参数为 null。

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

    【讨论】:

    • +1 因为尽管事实上我的答案很适合他现有的代码,但这是我将在我自己的代码中使用的方法。
    • 非常感谢。从您的有用答案中,我以一种新的方式看到了函数重载的优雅。
    • 遵循这种做法又带来了一个新问题:stackoverflow.com/questions/1160299/…
    • 其实我有一个错字。我会使用不同的方法名称,但仍然在内部遵循其他实现。 MessageName 的想法(来自另一个问题)很有趣,但我不确定拥有不同的命名方法不会真正给你带来什么。
    【解决方案2】:
    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)
    }
    

    【讨论】:

      【解决方案3】:

      如何将包括元数据数组在内的所有参数放入一个类中,并将其用作 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
        {
        }  
      }
      

      【讨论】:

      • 感谢您提出一个有趣的想法。我想最小化 Web 服务和使用 WS 的客户端需要知道的类型。我认为这将与该目标背道而驰,但否则这是一个好主意。谢谢。
      【解决方案4】:
      [WebMethod]
          public string UploadFileBasic( string wsURL
              , byte[] incomingArray
              , string FileName
              , string RecordTypeName)
      {
          return UploadFile(wsURL, incomingArray, FileName, RecordTypeName, new MetaData[0]);
      }
      

      然后 UploadFile 方法处理所有事情,但是您可以根据消费者的需要公开两个接口。

      【讨论】:

      • 他想避免对象创建开销(这可能甚至无法测量)。为这项工作包含一个 private static readonly 类成员很容易,因为 0 长度数组实际上是不可变的。
      • @280Z28 OP 说“我不想通过创建一个空数组作为第 5 个参数来增加客户端程序的负担。”,这不会给客户端/消费应用程序带来负担。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多