2011-01-26 3 views
5

В Excel вы можете вернуть динамический массив System.Object[*] из объекта серии, используя XValues. В .NET 3.5 вы можете получить доступ к элементам в этом объекте путем литья его и массив, то есть:.NET 4.0 Проблемы с взаимодействием Excel с динамическими коллекциями

var values = (Array)series.XValues; 

В .NET 4.0, это больше не работает, а сообщение

«Невозможно литой объект типа «System.Object [*]» для ввода «System.Object []» «

дано.

Любые идеи? Не работает:

  • Отливка как динамическая.
  • Литье до System.Object[*].
  • Просто поместите объект в a для каждого цикла.
  • Пытается получить доступ к значению напрямую, используя values[1], ни при динамическом преобразовании.

Однако значения внутри массива отображаются в отладчике.

ответ

5

В .NET существуют два разных типа массивов, одномерные «векторные» и многомерные массивы. Вы вернете последнего, многомерный массив с рангами 1. Это произойдет, если неуправляемый код вернет SAFEARRAY, нижняя граница которого не равна 0.

Вы можете прочитать содержимое массива с помощью Array. GetValue(). Или преобразовать его, как это:

private static object[] ConvertArray(Array arr) { 
     int lb = arr.GetLowerBound(0); 
     var ret = new object[arr.GetUpperBound(0) - lb + 1]; 
     for (int ix = 0; ix < ret.Length; ++ix) { 
      ret[ix] = arr.GetValue(ix + lb); 
     } 
     return ret; 
    } 

Тест:

var native = Array.CreateInstance(typeof(object), new int[] { 42 }, new int[] { 1 }); 
    var dotnet = ConvertArray(native); 

Примечание: вы можете иметь проблемы в .NET 4.0 и выше, если вы некоторые библиотеки COM типа, Офис в частности. Свойство или метод может возвращать вариант, содержащий массив. Заканчивается как динамический в вашей программе на C#. В этом случае компилятор C# не генерирует надлежащий код связующего. Поработайте над этим, отбросив сначала (объект), затем до (Массив).

+0

Этот вопрос меня не получает значение за пределами объекта массива, нижняя граница разве 0 вопрос я с Я не могу преобразовать коллекцию COM-объектов во все, что можно использовать .NET. Код примера, который вы предоставили, включает использование объекта типа Array, но я не могу отбросить коллекцию, которую я даю массиву. Спасибо за ваше время. –

+0

'Невозможно использовать объект типа 'System.Object [*]'. Это массив. –

+0

@HansPassant Трудность заключается в том, чтобы отбрасывать это, см. Ссылку в моем ответе для деталей. – GreyCloud

7

Ответ выше полезен, но не затрагивает вопрос о том, как отливать массив.

В версиях до версии 4.0 до 4,0 простой прогон будет работать.

в C# 4.0 необходимо использовать

System.Array a = (System.Array)((object) returnedObject); // note order of brackets 

см http://blogs.msdn.com/b/mshneer/archive/2010/06/01/oh-that-mysteriously-broken-visiblesliceritemslist.aspx

Смежные вопросы