次の例は、Lengthプロパティ・Rankプロパティ・GetLengthメソッドなどと組み合わせて多次元配列を扱う例です。 このコードでは、任意の次元数・要素数の多次元配列を引数にとり、その多次元配列の次元・長さ・要素数・格納されている全要素を表示するメソッドを実装しています。 どのような配列もArrayクラスから暗黙的に派生しているので、引数の型をArrayとすることで任意の配列を受け取れるようにしています。 また、配列内の全要素はforeach文と同じ順で列挙されるようにしています。

なお、このコードで使用しているGetValueメソッドは、引数としてインデックスを渡すことにより、配列内の該当するインデックスの値を取得することができるメソッドです。 詳しくは配列操作 §.配列の作成・要素の取得と設定 (CreateInstance, GetValue, SetValue)で解説しています。

任意の次元数・要素数の配列から、配列の次元・次元ごとの長さ・全要素数を取得する
using System;

class Sample {
  static void Print(Array arr)
  {
    Console.WriteLine("次元: {0}", arr.Rank);

    Console.Write("長さ: ");

    for (var d = 0; d < arr.Rank; d++) {
      if (0 < d)
        Console.Write("×{0}", arr.GetLength(d));
      else
        Console.Write("{0}", arr.GetLength(d));
    }

    Console.WriteLine();

    Console.WriteLine("要素数: {0}", arr.Length);

    Console.Write("要素: ");

    // 取得したい要素のインデックスを指定するための配列
    var indices = new int[arr.Rank];

    for (;;) {
      // [step1] step3でインデックスをインクリメントした結果、各次元の長さに達したかどうか調べる
      for (var d = arr.Rank - 1; 0 <= d; d--) {
        if (arr.GetLength(d) <= indices[d]) {
          // d次元目のインデックスがd次元目の長さを越えている場合
          if (d == 0) {
            // 1次元目(d = 0)の場合は、インクリメントした結果が1次元目の長さに達しているので終了する
            Console.WriteLine();
            return;
          }
          else {
            // d次元目のインデックスを0に戻し、一つ低い次元(d - 1次元)のインデックスをインクリメントする
            indices[d] = 0;
            indices[d - 1]++;
          }
        }
      }

      // [step2] 指定されたインデックスの要素を取得して表示
      Console.Write("{0}, ", arr.GetValue(indices));

      // [step3] もっとも高い次元のインデックスをインクリメント
      indices[arr.Rank - 1]++;
    }
  }

  static void Main()
  {
    // 5個の要素を持つ1次元配列
    int[] arr = {
      0, 1, 2, 3, 4,
    };

    Print(arr);
    Console.WriteLine();

    // 3×4個の要素を持つ2次元配列
    int[,] matrix = {
      {0, 1, 2, 3},
      {4, 5, 6, 7},
      {8, 9, 10, 11},
    };

    Print(matrix);
    Console.WriteLine();

    // 4×2×3個の要素を持つ3次元配列
    int[,,] cube = {
      {  { 0,  1,  2},  { 3,  4,  5}  },
      {  { 6,  7,  8},  { 9, 10, 11}  },
      {  {12, 13, 14},  {15, 16, 17}  },
      {  {18, 19, 20},  {21, 22, 23}  },
    };

    Print(cube);
    Console.WriteLine();

    // 2×2×2×2個の要素を持つ4次元配列
    int[,,,] tesseract = {
      {  {  {0, 1},  { 2,  3}  },  {  { 4,  5},  { 6,  7}  }  },
      {  {  {8, 9},  {10, 11}  },  {  {12, 13},  {14, 15}  }  },
    };

    Print(tesseract);
    Console.WriteLine();

    // 1×1×1×1×1個の要素を持つ5次元配列
    Print(new int[1, 1, 1, 1, 1]);
    Console.WriteLine();

    // 1×0×1×0×1×0個の要素を持つ6次元配列
    Print(new int[1, 0, 1, 0, 1, 0]);
    Console.WriteLine();
  }
}
実行結果
次元: 1
長さ: 5
要素数: 5
要素: 0, 1, 2, 3, 4, 

次元: 2
長さ: 3×4
要素数: 12
要素: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 

次元: 3
長さ: 4×2×3
要素数: 24
要素: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 

次元: 4
長さ: 2×2×2×2
要素数: 16
要素: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 

次元: 5
長さ: 1×1×1×1×1
要素数: 1
要素: 0, 

次元: 6
長さ: 1×0×1×0×1×0
要素数: 0
要素: