2011-01-26 14 views
5

Excelでは、XValuesを使用するシリーズオブジェクトから動的配列System.Object[*]を返すことができます。 .NET 3.5では、あなたがすなわち、に、配列、それをキャストすることによって、このオブジェクト内の要素にアクセスすることができます.NET 4.0で.NET 4.0 Excel Interopで動的コレクションの問題が発生する

var values = (Array)series.XValues; 

を、これはもはや機能し、メッセージ

「にできません。 'System.Object [*]'型のキャストオブジェクトで 'System.Object []'と入力してください。

が挙げられます。

アイデア?以下は動作しません。

  • ダイナミックとしてキャストします。
  • System.Object[*]にキャストしてください。
  • オブジェクトをループごとに配置するだけです。
  • values[1]を使用して直接値にアクセスしようとしましたが、ダイナミックとしてキャストされていません。

しかし、配列内の値はデバッガに表示されます。

答えて

5

.NETには、1次元の「ベクトル」配列と多次元配列の2種類の配列があります。後者の場合、ランク1の多次元配列が返されます。これは、アンマネージコードが下限が0ではないSAFEARRAYを返した場合に発生します。

配列の内容は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

を参照してくださいを使用する必要があります。 COMオブジェクトコレクションを.NETで使用可能なものに変換できません。指定したサンプルコードには、Array型のオブジェクトを使用していますが、配列に与えられたコレクションをキャストできません。 お時間をいただきありがとうございます。 –

+0

'タイプ 'System.Object [*]'のオブジェクトをキャストできません。それは配列です。 –

+0

@HansPassant難しいのはそれをキャストしています、詳細は私の答えのリンクを参照してください。 – GreyCloud

7

上記の答えは便利ですが、Arrayにキャストする方法の問題は扱いません。

4.0より前の.Netバージョンでは、単純なキャストが機能します。 C#4.0 1における

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

私が持っている問題は、その下限イマイチ0 Arrayオブジェクト、私がいる問題の外の値を取得していない http://blogs.msdn.com/b/mshneer/archive/2010/06/01/oh-that-mysteriously-broken-visiblesliceritemslist.aspx

関連する問題