【问题标题】:Return a variable of type assigned in parameters?返回参数中分配的类型变量?
【发布时间】:2013-01-15 16:53:04
【问题描述】:

我正在尝试创建一个类似于 Windows 窗体的类,它将具有多个新功能。它只是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);

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

【问题讨论】:

  • OnSizeChanged 比覆盖 onresize 有什么好处?
  • @P.Brian.Mackey 不知道它的存在! OnResize 似乎需要我先打电话给base.OnResize(),但我想这没什么大不了的 =)

标签: c# winforms class types


【解决方案1】:

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

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

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

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

var tb = CreateAndAdd<TextBox>()

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

【讨论】:

  • 领先我几秒 :)
  • 这正是我想要的,谢谢 =) 我是 C# 的新手,很高兴有你们来帮忙!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-19
  • 2017-02-03
  • 2017-07-19
  • 2017-11-28
  • 1970-01-01
  • 2020-02-06
相关资源
最近更新 更多