Передача аргумента методу, который требует "ref System.Array" - PullRequest
1 голос
/ 21 августа 2009

Я использую стороннюю библиотеку. Один из методов требует передачи массива через ref, который будет заполнен некоторой информацией. Вот определение метода:

int GetPositionList(ref Array arrayPos)

Как мне построить arrayPos, чтобы этот метод работал? В не очень полной документации библиотеки она определяет метод следующим образом:

long GetPositionList(structSTIPosUpdate() arrayPos)

Я пробовал это, но, конечно, я получаю ошибки:

System.Array position_list = new System.Array();
sti_position.GetPositionList(ref position_list);

Есть идеи?

Ответы [ 6 ]

3 голосов
/ 21 августа 2009

Это ActiveX API Sterling Trader Pro, верно? Вы создали Interop dll, используя tlbimp.exe? API GetPositionList ожидает массив, который будет содержать структуры типа structSTIPositionUpdate. Обычно модификатор out используется, если вызываемый объект инициализирует передаваемые данные, и ref, если данные должны быть инициализированы. Согласно значению API модификатор должен быть out, чтобы это работало:

structSTIPositionUpdate [] entries = new structSTIPositionUpdate[0]; // or null
num_entries_returned = GetPositionList(ref entries);

В качестве альтернативы, попробуйте создать массив этих структур, достаточно большой, чтобы вместить ожидаемое количество записей, а затем передать его в функцию:

structSTIPositionUpdate [] entries = new structSTIPositionUpdate[100]; // say
num_entries_returned = GetPositionList(entries);

Обновление: Если вы получаете несоответствия типов с System.Array, попробуйте

System.Array entries = Array.CreateInstance(typeOf(structSTIPositionUpdate), N);

где N - количество элементов в массиве.

2 голосов
/ 21 августа 2009

Для создания экземпляра Array вы можете использовать метод CreateInstance:

Array a = Array.CreateInstance(typeof(Int32), 10);
GetPositionList(ref a);

Тип, размер и размер массива - это то, что должен задокументировать автор библиотеки. GetPositionList может быть плохо спроектирован и просто создать для вас новый Array, что означает, что автор библиотеки должен был использовать out вместо ref. В этом случае вы можете использовать массив null:

Array a = null;
GetPositionList(ref a);
1 голос
/ 21 августа 2009

Вы можете использовать Array.CreateInstance

0 голосов
/ 24 октября 2013

Я также использую Sterling Trader API. Я использую этот код:

private structSTIPositionUpdate[] PositionList {
        get {
            Array arrayPos = null;
            _position.GetPositionList(ref arrayPos);
            return (structSTIPositionUpdate[]) arrayPos;
        }
    }
0 голосов
/ 21 августа 2009

Это работает:

Array position_list = new int[]{1, 3, 5, 5,6};    
sti_position.GetPositionList(ref    position_list);
0 голосов
/ 21 августа 2009

Это может помочь вам: http://msdn.microsoft.com/en-us/library/szasx730%28VS.80%29.aspx

... хотя я не понимаю, почему объект должен иметь ключевое слово "ref". Объекты передаются по ссылке, так что это должно работать в любом случае, без использования ключевого слова ref. Для массивов типа int[] или string я понимаю это ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...