2011-01-26 2 views
5

Excel에서는 XValues을 사용하는 시리즈 개체에서 동적 배열 System.Object[*]을 반환 할 수 있습니다. 에.NET 4.0 Excel Interop의 동적 컬렉션 관련 문제

.NET 4.0
var values = (Array)series.XValues; 

이 더 이상 작동하고, 메시지

"없습니다 .NET 3.5에서는 예와 배열을 캐스팅하여이 객체의 요소에 액세스 할 수 있습니다 형식 'System.Object [*]'형식의 캐스팅 개체 'System.Object []' "

이 제공됩니다.

아이디어가 있으십니까? 다음은 작동하지 않습니다.

  • 동적으로 전송합니다.
  • System.Object[*]으로 주조하십시오.
  • 개체를 각 루프마다 배치합니다.
  • values[1]을 사용하여 값에 직접 액세스하려고했으나 동적으로 캐스팅하지 않았습니다.

그러나 배열 내부의 값은 디버거에 표시됩니다.

답변

5

.NET에는 1 차원 '벡터'및 다차원 배열이라는 두 가지 종류의 배열이 있습니다. 후자는 1의 차수를 갖는 다차원 배열입니다. 관리되지 않는 코드가 하한이 0이 아닌 SAFEARRAY를 반환하면 발생합니다.

배열을 사용하여 배열의 내용을 읽을 수 있습니다. 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 Array 객체, 문제 이외의 값을받지 못하고있다가이 문제를 볼 사용해야합니다 .NET에서 사용할 수있는 COM 개체 컬렉션을 변환 할 수 없습니다. 제공 한 예제 코드에는 Array 유형의 객체를 사용하는 것이 포함되어 있지만 배열에 주어진 컬렉션을 캐스트 할 수 없습니다. 그러나 시간 내 주셔서 감사합니다. –

+0

''System.Object [*]'형식의 객체를 형 변환 할 수 없습니다. 그것은 배열입니다. –

+0

@HansPassant 난이도에 캐스팅하는 데 어려움이 있습니다. 자세한 내용은 내 대답의 링크를 참조하십시오. – GreyCloud