Как использовать пользовательский тип массива, определенный в WSDL?

#c# #delphi #wsdl

#c# #delphi #wsdl

Вопрос:

Пытаюсь узнать, как использовать WSDL в приложении Delphi 7. WSDL, который я пытаюсь использовать, имеет пользовательский тип массива.

Паскаль

 ArrayOfSomething = array of Something;
 

Как мне создать экземпляр этого типа массива?

Пробовали:

Паскаль

 var 
    somethingList : ArrayOfSomething;
begin
    somethingList := ArrayOfSomething...
end;
 

The … выше означает, что я ищу метод и не нахожу его. Обычным способом я бы создал экземпляр объекта, например:

Паскаль

 var 
    object : className;
begin
    object := className.Create;
end;
 

Итак, вы можете понять, почему я пытаюсь создать массив таким же образом, даже если это не объект.

Имейте в виду, я переписываю код C # и пытаюсь заставить его работать на Pascal. Исходный C # похож:

C#

    List<Something> somethingList = new List<Something>();
 

И использование похоже:

C#

    envelope.listField = somethingList.ToArray();
 

Я также пробовал это:

Паскаль

    var
       somethingList : TList;
   begin
       somethingList := TList.Create;
   end;
 

Да, это работает, пока я не попытаюсь отправить его в конверт.

Паскаль

    envelope.listField := somethingList;
 

Конверт ожидает ArrayOfSomething не TList . Ошибка — это что-то вроде «Несовместимые типы, TList и ArrayOfSomething».

Ответ №1:

An array of — это встроенный тип, это не класс. Чтобы задать его размер, используйте SetLength() , например

 var
  Arr: ArrayOfSomething;
begin
  SetLength(Arr, 273);
 

Также обратите внимание, что это не то же самое, что список, это массив, в котором нет встроенного способа вставки или удаления значений. Вы можете читать и изменять значения или изменять размер массива, не более.

Если вам нужны обобщения, как в C #, вам придется использовать более высокую версию Delphi, чем 7. Я не уверен, но я думаю, что они были введены в Delphi 2010 или Delphi XE. Я думаю, кто-нибудь может сообщить мне об этом (обновление: Дэвид Хеффернан сказал мне, что это версия 2009)

В этих более высоких версиях вы также можете использовать TList<T> , что, вероятно, то, что вы хотите. До тех пор вы можете использовать TList, который содержит указатели (но не может быть использован напрямую в связи с WSDL, поэтому содержимое, возможно, придется сначала переместить в массив). Возможно, вам придется использовать New() , Dispose() и приведения, чтобы использовать его.

Комментарии:

1. Delphi 2009 для обобщений

2. Итак, подводя итог, маршрут, по которому я иду, просто не будет работать, но есть обходной путь с TList .

3. @user Вы не хотите иметь ничего общего с TList. У вас есть динамический массив.

4. Я не знаю, по какому маршруту вы хотите пойти. Динамические массивы могут быть очень полезны, возможно, также в вашем коде, но они не являются списками. Чтобы получить списки, к которым вы привыкли в C #, вам нужно будет получить более современную версию, чем Delphi 7, которая, IIRC, примерно такая же старая, как C # 1.0 (в которой также не было дженериков).

5. @Rudy в WSDL используются динамические массивы. Поэтому предложение TList кажется тупиковым.

Ответ №2:

 type
  ArrayOfSomething = array of Something;
 

Это динамический массив Delphi. Вы инициализируете его вызовом SetLength :

 SetLength(somethingList, 42);
 

Вам следует ознакомиться с документацией по динамическим массивам, чтобы узнать больше.