C # bucle sobre una matriz de dimensiones desconocidas

Quiero crear un método de extensión para recorrerSystem.Array con un número desconocido de dimensiones

Por ahora estoy usando un enfoque ingenuo:

public static void ForEach<T>(this Array source, Action<T> action)
{
    if(source.Rank == 1)
    {
        for (int w = 0; w < source.GetLength(0); w++)
        {
            action((T)source.GetValue(w));
        }
    }
    else if(source.Rank == 2)
    {
        for (int h = 0; h < source.GetLength(1); h++)
        {
            for (int w = 0; w < source.GetLength(0); w++)
            {
                action((T)source.GetValue(h, w));
            }
        }
    }
    else if(source.Rank == 3)
    {
        // etc
    }
}

Estoy seguro, hay una forma mucho más elegante de hacerlo. Pero no puedo entenderlo. ¿Cómo generalizo ese método para un número ilimitado de dimensiones?

Respuestas a la pregunta(3)

Su respuesta a la pregunta