Лучший способ сделать аргумент необязательным для веб-метода C # - PullRequest
2 голосов
/ 21 июля 2009

Каков наилучший способ поддержки необязательных данных, передаваемых в функцию C #?

У меня есть функция веб-службы в .Net, которая определяет 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 аргумента (то есть, не массив «Метаданные» в качестве последнего аргумента), поэтому я клонировал всю функцию и удалил блок IF-ELSE, ссылающийся на метаданные. Гадкий я знаю.

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

Теперь я хочу сделать что-то лучше и ищу советы о том, как лучше всего это поддержать. Я не хочу обременять клиентскую программу созданием пустого массива в качестве 5-го параметра ... Я хочу, чтобы функции моего веб-сервиса были достаточно умными для обработки этих необязательных данных. Благодарю.

Ответы [ 4 ]

7 голосов
/ 21 июля 2009

Измените проверку в методе, который принимает 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 );
}
3 голосов
/ 21 июля 2009
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)
}
2 голосов
/ 21 июля 2009

Как насчет помещения всех аргументов, включая массив метаданных, в один класс и использования его в качестве аргумента для веб-службы:

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
  {
  }  
}
0 голосов
/ 21 июля 2009
[WebMethod]
    public string UploadFileBasic( string wsURL
        , byte[] incomingArray
        , string FileName
        , string RecordTypeName)
{
    return UploadFile(wsURL, incomingArray, FileName, RecordTypeName, new MetaData[0]);
}

Затем метод UploadFile обрабатывает все, но вы можете предоставить два интерфейса в зависимости от того, что хочет потребитель.

...