Как писал @Barry, вам придется сделать это самостоятельно. Самый простой способ - использовать словарь. Ключом может быть тип формы, ее имя или все, что вам нужно.
private static readonly Dictionary<string, MyForm> _dict
= new Dictionary<string, MyForm>();
public MyForm CreateOrShow(string formName)
{
Form f = null;
if (!_dict.TryGetValue(formName, out f))
{
f = new MyForm();
_dict.Add(formName, f);
}
return f;
}
Или, если вы хотите поддерживать несколько типов форм и хотите избежать приведения, используйте общий метод:
private static readonly Dictionary<string, Form> _dict
= new Dictionary<string, Form>();
public T CreateOrShow<T>(string formName) where T : Form, new()
{
Form f = null;
if (!_dict.TryGetValue(formName, out f))
{
f = new T();
_dict.Add(formName, f);
}
return (T)f;
}
public T CreateOrShow<T>(string formName, Func<T> ctor) where T : Form
{
Form f = null;
if (!_dict.TryGetValue(formName, out f))
{
f = ctor();
_dict.Add(formName, f);
}
return (T)f;
}
Есть две общие перегрузки. Один из них используется так:
// use this if MyFormType has a parameterless constructor
var form = CreateOrShow<MyFormType>("Form1");
или, если вам нужно передать параметры в форму во время инициализации:
// use this if MyFormType accepts parameters in constructor
var form = CreateOrShow<MyFormType>("Form1", () => new MyFormType(someData));