You can do that by having a "manager" class that manage the child form. 1. Caller call a method in the manager, given the type of the form that you want to open. 2. Manager check MdiChildren of that type, if it finds it, return the form object back to caller. 3. If manager not able to find it, then create a new instance via reflection, then return back to caller. 4. Caller receive the form, do necessary action on the form (pass object, show, etc) You can mix it up a bit by having some form can only be opened as 1 instance, while other form can be opened multiple time, by adding customattribute to the form class or adding an "AllowMultiple" via subclassing Form. This is by no means the only way.