I'm not sure I quite understand what are you trying to achieve. I'll try to guess.
If you know that the needed amount of type parameters will never exceed four, you could just make an array
Type[] types = new Type[] { typeof(Action<>), typeof(Action<,>), typeof(Action<,,>) }; // omitted the rest
And provide a function
int CalculateNumberOfParameters(int i)
{
// I don't know what your i variable really means, but I suggest you have some method to determine a number of type parameters from it).
}
Then you just use types[CalculateNumberOfParameters(i)] to get your action type. Note that I provided an array of non-parameterized generics, so you should call MakeGenericType() on them to create an actual instantiable type. If you know your generic parameters beforehand (and they don't depend on i), you should specify them at type array creation.
If you can never tell how much generic parameters you will need, you will have to create types at runtime, because .net only defines Action with 0-4 parameters. You will still have to provide a conversion (or adapter) to one of the standard types, so instances of your created type can actually be useable from another parts of your application. This is a hard route, and I only had to use it once (for linq expression serialization), so I won't go deep into details unless specifically asked.