返回参数中指定的类型变量?

1 c# types class winforms

我正在尝试创建一个类似Windows Form的类,它将具有多个新功能.它只是一个"更好"的版本Form,使我的工作更容易在这个确切的程序.这是我到目前为止所拥有的:

public class SuperForm : Form
{
    protected abstract void OnSizeChanged(object sender, EventArgs e);

    public SuperForm()
    {
        this.SizeChanged += OnSizeChanged;
    }
}
Run Code Online (Sandbox Code Playgroud)

并不多,它只能确保每个Form都必须定义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;
}
Run Code Online (Sandbox Code Playgroud)

我知道ClassType这不是一个有效的类型,这就是我需要帮助的原因.

然后我基本上可以这样称呼它:

Button b = this.NewControl(Button);
Run Code Online (Sandbox Code Playgroud)

这将返回一个新按钮,并将其添加到this.Controls.当控件初始化时,我可能最终需要完成更多这些常见任务,这就是为什么我想在它自己的方法中使用它.

这可能在C#中吗?如果没有,有任何解决方法吗?一种方法是为每个继承的类定义一个方法,Control如下所示:

public Button NewControl(Button b);
public TextBox NewControl(TextBox tb);
public ListBox NewControl(ListBox lb);
Run Code Online (Sandbox Code Playgroud)

但它对我来说似乎不是一个有效的选择.

Jon*_*eet 5

听起来你想要制作一个通用方法,对type参数有几个约束:

public T CreateAndAdd<T>() where T : Control, new()
{
    T newControl = new T();
    Controls.Add(newControl);
    return newControl;
}
Run Code Online (Sandbox Code Playgroud)

这里的T : Control约束确保您创建一个控件,以便您可以使用Controls.Add.该T : new()约束可以确保类型参数有一个公共参数的构造函数,这样就可以调用new T().

例如,要创建TextBox,您可以像这样调用函数:

var tb = CreateAndAdd<TextBox>()
Run Code Online (Sandbox Code Playgroud)

(我已经重新命名了我认为清晰的方法,顺便说一下.)