5

System.Object[*]Excelでは、を使用して系列オブジェクトから動的配列を返すことができますXValues。.NET 3.5では、このオブジェクトを配列にキャストすることで、このオブジェクトの要素にアクセスできます。

var values = (Array)series.XValues;

.NET 4.0では、これは機能しなくなり、メッセージが表示されます

「タイプ'System.Object[*]'のオブジェクトをタイプ'System.Object[]'にキャストできません」

与えられます。

何か案は?以下は機能しません。

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

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

4

2 に答える 2

7

上記の答えは便利ですが、配列にキャストする方法の問題には対処していません。

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

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を参照してください

于 2012-01-13T15:39:35.187 に答える
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);

注:一部のCOMタイプのライブラリ、特にOfficeを使用している場合、.NET4.0以降で問題が発生する可能性があります。プロパティまたはメソッドは、配列を含むバリアントを返す場合があります。C#プログラムでは動的になります。その場合、C#コンパイラは適切なバインダーコードを生成しません。最初に(オブジェクト)にキャストし、次に(配列)にキャストすることで、この問題を回避します。

于 2011-01-26T19:02:52.187 に答える