我正在尝试创建一个类似Windows Form的类,它将具有多个新功能。它只是Form
的“更好”版本,使我的工作更容易在这个确切的程序。这是我到目前为止所做的:
public class SuperForm : Form
{
protected abstract void OnSizeChanged(object sender, EventArgs e);
public SuperForm()
{
this.SizeChanged += OnSizeChanged;
}
}
并不多,它只确保每个表格都必须定义OnSizeChanged
,当尺寸发生变化时会自动调用,但会有更多。
接下来我需要的是一个方法,它接受类/类型作为参数并初始化该类型的新对象,自动将其添加到Controls
然后返回该对象。这是一个示例代码(不工作),我希望它如何:
public cls NewControl(ClassType cls) // This obviously doesn't work.
// I need it to return an object of type "cls" parameter.
{
cls newControl = new cls();
this.Controls.Add(newControl);
return newControl;
}
我知道ClassType
不是有效类型,这就是我需要帮助的原因。
然后我基本上可以这样称呼它:
Button b = this.NewControl(Button);
哪个会返回一个新按钮,并将其添加到this.Controls
。当控件初始化时,我可能最终需要完成更多这些常见任务,这就是为什么我想在它自己的方法中使用它。
这在C#中是否可行?如果没有,有任何解决方法吗?一种方法是为每个继承自Control
的类定义一个方法,如下所示:
public Button NewControl(Button b);
public TextBox NewControl(TextBox tb);
public ListBox NewControl(ListBox lb);
但它对我来说似乎不是一个有效的选择。
答案 0 :(得分:5)
听起来你想要制作一个通用方法,对类型参数有几个约束:
public T CreateAndAdd<T>() where T : Control, new()
{
T newControl = new T();
Controls.Add(newControl);
return newControl;
}
此处T : Control
约束可确保您创建控件,以便您能够使用Controls.Add
。 T : new()
约束确保type参数具有公共无参数构造函数,以便您可以调用new T()
。
例如,要创建TextBox,您可以像这样调用函数:
var tb = CreateAndAdd<TextBox>()
(我已将该方法重命名为我认为清晰的方法,顺便说一句。)