実行時にオブジェクトが配列か、多次元配列か、多段ジャグ配列かどうかを調べるたい場合、型情報(Type)を参照することで検証することができます。

型情報からは、まずType.IsArrayプロパティによって、型が配列(多次元配列・多段ジャグ配列を含む)かどうかを判別することができます。 また、Array.Rankプロパティを参照することにより、Rankが1なら配列またはジャグ配列、2以上なら多次元配列として分類することができます。 さらに、Type.GetElementTypeメソッドを呼び出すことにより、配列の要素の型を取得することができるため、1次元の配列なのかジャグ配列なのか、またジャグ配列の場合は何段なのかを知ることができます。

これを具体的なコードにすると、次のようになります。

オブジェクトが配列か多次元配列かジャグ配列かを判別する
using System;

class Sample {
  static void Main()
  {
    PrintTypeOfArray(new int[0]);
    PrintTypeOfArray(new int[0, 0]);
    PrintTypeOfArray(new int[0, 0, 0]);
    PrintTypeOfArray(new int[1][] { new int[0] });
    PrintTypeOfArray(new int[1][][] { new int[1][] { new int[0] } });
    PrintTypeOfArray(0);
    PrintTypeOfArray(null);
  }

  // 引数で与えられるオブジェクトから、配列の種類を分類して表示する
  static void PrintTypeOfArray(object o)
  {
    if (o is null) {
      Console.WriteLine("nullです");
      return;
    }

    // 型情報を取得する
    var t = o.GetType();

    // 型が配列かどうか
    if (!t.IsArray) {
      Console.WriteLine($"配列ではありません ({t})");
      return;
    }

    // 配列(Array)にキャスト
    var arr = (Array)o;

    // 配列は多次元化かどうか
    if (1 < arr.Rank) {
      Console.WriteLine($"{arr.Rank}次元配列です ({t})");
    }
    else {
      // 配列が1次元の場合、配列の要素の型が配列となっているか
      // どうかを再帰的に調べ、同時にその段数も調べる
      var nest = 1;
      var te = t;

      for (;;) {
        te = te.GetElementType();

        // 配列の要素の型が配列かどうか
        if (te.IsArray)
          nest++; // 段数を計上する
        else
          break;
      }

      if (nest == 1)
        Console.WriteLine($"配列です ({t})");
      else
        Console.WriteLine($"{nest}段のジャグ配列です ({t})");
    }
  }
}
実行結果
配列です (System.Int32[])
2次元配列です (System.Int32[,])
3次元配列です (System.Int32[,,])
2段ジャグ配列です (System.Int32[][])
3段ジャグ配列です (System.Int32[][][])
配列ではありません (System.Int32)
Nothingです