返回参数中赋值的类型变量

本文关键字:类型变量 赋值 参数 返回 | 更新日期: 2023-09-27 17:56:46

我正在尝试创建一个像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);

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

返回参数中赋值的类型变量

听起来你想做一个泛型方法,对类型参数有几个约束:

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

在这里,T : Control约束确保您正在创建控件,以便能够使用 Controls.AddT : new()约束确保类型参数具有公共无参数构造函数,以便您可以调用new T()

例如,若要创建文本框,应按如下所示调用该函数:

var tb = CreateAndAdd<TextBox>()

(我已经重命名了我认为清晰的方法,顺便说一句。