gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 20:19:16 26 4
gpt4 key购买 nike

我正在尝试创建一个类似于 Windows 窗体的类,它将具有多个新功能。它只是 Form 的“更好”版本,使我在这个程序上的工作更加轻松。这是我到目前为止所拥有的:

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

public SuperForm()
{
this.SizeChanged += OnSizeChanged;
}
}

不多,它只是确保每个 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;
}

我知道 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() 约束确保类型参数具有公共(public)无参数构造函数,以便您可以调用 new T()

例如,要创建一个文本框,您可以这样调用该函数:

var tb = CreateAndAdd<TextBox>()

(顺便说一句,为了清楚起见,我已经重命名了该方法。)

关于c# - 返回参数中指定类型的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14628309/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com