我有这个在面板内打开表单的通用方法,这个方法继承自Form
,目前的限制是它有一个空的构造函数(where T : Form, new())
private void AbrirFormulario<T>() where T : Form, new()
{
Form formulario = panel_contenedor.Controls.OfType<T>().FirstOrDefault();
if (formulario!=null)
{
//Si la instancia esta minimizada la dejamos en su estado normal
if (formulario.WindowState == FormWindowState.Minimized)
{
formulario.WindowState = FormWindowState.Normal;
}
//Si la instancia existe la pongo en primer plano
formulario.BringToFront();
return;
}
//Se abre el form
formulario = new T();
formulario.TopLevel = false;
panel_contenedor.Controls.Add(formulario);
panel_contenedor.Tag = formulario;
formulario.Show();
}
这样称呼它:
AbrirFormulario<FormularioX>();
如何调整此函数以将参数传递给表单?
在这种情况下,我需要将两个参数传递给表单,如下所示:
AbrirFormulario<FormularioX>(parametro1, parametro2);
但是将来您可能需要根据表单使用 1/2/3 参数。
参数可能因类型而异,可以是:
bool
、string
等int
。
知道如何实现这一目标吗?,传递参数列表,可选列表(如可选参数)或类似的东西?
环境:Visual Studio 2010 & .NET NetFramework 4。
我觉得这个问题很有趣,所以我将尝试给出一个选项,尽管它可能不是理想的选项。
主要问题是无法在 C# 中强制使用特定的构造函数。这给我们留下了一种可能的选择(也许还有更多)。
我的建议是创建一个接口来创建一个允许接收参数的方法。这是一个例子:
这里我们定义一个方法,
InicializarParametros
实现这个接口的表单必须满足这个方法。稍后,在必须从泛型表单调用的表单中,我们在其定义中添加接口,以及强制方法:
现在我们定义打开表单的通用方法如下:
最后,使用它的方式如下:
请注意,由于我已经定义了方法
InicializarParametros
,示例 2 和示例 3 将因参数数量不正确而引发异常。在每种情况下,您必须控制它。最后我决定用Reflection (C#)来做。在这种情况下,删除限制
new()
以允许没有无参数构造函数的表单:现在,要创建实例,请使用
Activator.CreateInstance
:所以完整的解决方案如下所示:
并以这些方式使用它:
最终解决方案:
实际上,最好的方法是使用工厂方法
Func<T>
来构建表单:假设我们有这个
Form
,只是为了测试目的:使用这样的方法:
然后这样调用:
伴随着所有有用的智能感知:
所以现在我们留下了自文档代码,不管表单是如何构建的,它不会强迫你使用界面。
使用问题
params object[] args
:现在有一些关于构造函数的有用的自记录特性,即参数具有名称。并使用这样的东西:
它不会向调用者提供有关“参数”是什么、它们属于什么顺序或它们的含义的任何信息。所以当我们这样称呼它时:
Intellisense 对您没有帮助,因为它仅表明您需要将一些(或没有)参数传递给该方法。
您可以覆盖该方法并增加动态参数的参数。
及其使用方式