Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 返回参数中指定的类型的变量?_C#_Winforms_Class_Types - Fatal编程技术网

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

C# 返回参数中指定的类型的变量?,c#,winforms,class,types,C#,Winforms,Class,Types,我正在尝试创建一个类似Windows窗体的类,它将具有多个新功能。它只是将成为表单的一个“更好”的版本,使我在这个确切的程序上的工作更容易。以下是我目前掌握的情况: public class SuperForm : Form { protected abstract void OnSizeChanged(object sender, EventArgs e); public SuperForm() { this.SizeChanged += OnSize

我正在尝试创建一个类似Windows窗体的类,它将具有多个新功能。它只是将成为
表单
的一个“更好”的版本,使我在这个确切的程序上的工作更容易。以下是我目前掌握的情况:

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

    public SuperForm()
    {
        this.SizeChanged += OnSizeChanged;
    }
}
没有太多,它只是确保每个表单都必须定义
OnSizeChanged
,当大小改变时会自动调用,但还会有更多

接下来我需要的是一个方法,它将类/类型作为参数,初始化该类型的新对象,自动将其添加到
控件中,然后返回该对象。下面是一个示例代码(不起作用),我希望它是这样的:

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);
public Button NewControl(Button b);
public TextBox NewControl(TextBox tb);
public ListBox NewControl(ListBox lb);
var tb = CreateAndAdd<TextBox>()
这将返回一个新按钮,并将其添加到
this.Controls
。在初始化控件时,我可能最终需要执行更多这些常见任务,因此我希望在它自己的方法中使用它

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

Button b = this.NewControl(Button);
public Button NewControl(Button b);
public TextBox NewControl(TextBox tb);
public ListBox NewControl(ListBox lb);
var tb = CreateAndAdd<TextBox>()

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

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

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

(顺便说一句,我已经重命名了这个方法,因为我认为它很清晰。)

听起来您想创建一个通用方法,对类型参数有一些限制:

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

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

OnSizeChanged比重写onresize更好吗?@p.Brian.Mackey不知道存在一个
OnResize
似乎要求我首先调用
base.OnResize()
,但我想这没什么大不了的=)OnSizeChanged比重写OnResize好多少?@P.Brian.Mackey不知道存在一个
OnResize
似乎要求我先调用
base.OnResize()
,但我想这没什么大不了的=)比我快几秒钟:)这正是我想要的,谢谢=)我对C有点陌生,很高兴有你们来帮忙!比我快几秒钟:)这正是我想要的,谢谢=)我对C#有点陌生,很高兴你们能来帮忙!