I've seen this code in many places but I'm having a hard time understanding what is happening. It works, but it looks redundant to me.
public abstract class BaseController<T> : ControllerBase where T : BaseController<T>
I don't understand where T : BaseController<T>
... this looks like a loop.