Проблемы взаимодействия .NET 4.0 Excel с динамическими коллекциями - PullRequest
5 голосов
/ 26 января 2011

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

var values = (Array)series.XValues;

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

"Невозможно привести объект типа 'System.Object [*]' к типу 'System.Object []'"

.

Есть идеи?Следующее не работает:

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

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

Ответы [ 2 ]

7 голосов
/ 13 января 2012

Ответ выше полезен, но не решает проблему преобразования в Array.

В версиях .Net до 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

5 голосов
/ 26 января 2011

В .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 # не генерирует правильный код связующего.Чтобы обойти это, приведите сначала к (объекту), а затем к (массиву).

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