2011-01-26 11 views
5

En Excel puede devolver una matriz dinámica System.Object[*], a partir de una serie de objetos utilizando XValues. En .NET 3.5 se puede acceder a los elementos de este objeto echándola por y la matriz, es decir:.NET 4.0 problemas de Excel de interoperabilidad con colecciones dinámicas

var values = (Array)series.XValues; 

en .NET 4.0, esto ya no funciona, y el mensaje

"No se puede convertir el objeto de tipo 'System.Object [*]' al tipo 'System.Object []'" se da

.

¿Alguna idea? Lo siguiente no funciona:

  • Fundido como dinámico.
  • casting a un System.Object[*].
  • Simplemente colocando el objeto en a para cada ciclo.
  • Intentar acceder directamente usando el valor values[1], ni cuando se lanza como una dinámica.

Sin embargo, los valores dentro de la matriz aparecen en el depurador.

Respuesta

5

Hay dos distintos tipo de matrices en .NET, una sola dimensión 'vector' y matrices multidimensionales. Recuperaste el último, una matriz multidimensional con un rango de 1. Esto sucederá si el código no administrado ha devuelto SAFEARRAY cuyo límite inferior no es 0.

Puedes leer el contenido de la matriz con Array. GetValue() O convertirlo, así:

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; 
    } 

prueba:

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

NOTA: es posible que tenga un problema en .NET 4.0 hacia arriba, cuando algunas bibliotecas de tipos COM, Oficina en particular. La propiedad o el método pueden devolver una variante que contiene una matriz. Termina como dinámico en su programa C#. El compilador de C# no genera el código de enlace apropiado en ese caso. Trabaja en eso lanzando primero a (objeto), luego a (Matriz).

+0

El problema que tengo no está recibiendo el valor fuera de un objeto Array cuya isnt-límite inferior 0, el problema que estoy teniendo es que no puedo convertir la colección de objetos COM en nada utilizable por .NET. El código de ejemplo que proporcionó involucra el uso de un objeto de tipo Array, pero no puedo transmitir la colección que se me da a una matriz. Gracias por su tiempo sin embargo. –

+0

'No se puede convertir el objeto de tipo 'System.Object [*]'. Eso es una matriz. –

+0

@HansPassant la dificultad está en lanzar eso, ver el enlace en mi respuesta para más detalles. – GreyCloud

Cuestiones relacionadas