Проблема с обобщениями в том, что вы не можете определить ограничение для сложного конструктора.Единственным ограничением является наличие пустого конструктора.
public static T CreateInstance<T>() where T : new()
{
return new T();
}
Однако, если вы хотите передать параметр, вам придется использовать другие методы, такие как Activator.CreateInstance
.Вы также можете использовать лямбду.
public static T CreateInstance<T>(Func<FormControl, T> builder, FormControl parent)
{
return builder(parent);
}
Но вам придется предоставить определенную лямбду для построения вашего объекта, для каждого отдельного объекта.
MyButton b = CreateInstance<MyButton>(parent => new MyButton(parent), SomeformInstance);
Используя отражение, вы можетесделать код проще и автоматически использовать предопределенный конструктор.Но используя лямбду, вы можете использовать класс, который не соответствует данному соглашению, и заполнить другие аргументы конструктора своими данными.
var b2 = CreateInstance<MyOtherButton>(
parent => new MyOtherButton("name", 42, parent), SomeformInstance
);