将未知类型的Object传递给函数
本文关键字:函数 Object 未知 类型 | 更新日期: 2023-09-27 18:19:51
所以这是我的代码:
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (listBox1.SelectedItem.ToString()=="Light" && Form.ActiveForm.Name != "Light")
{
Light o = new Light();
o.Show();
o.listBox1.SelectedIndex = listBox1.SelectedIndex;
NeedsToClose = false;
this.Close();
}
else if(listBox1.SelectedItem.ToString() == "Acceleration"&& Form.ActiveForm.Name !="Acceleration")
{
Acceleration o = new Acceleration();
o.Show();
o.listBox1.SelectedIndex = listBox1.SelectedIndex;
NeedsToClose = false;
this.Close();
}
}
它是有效的,但正如你所看到的,我在这两种情况下都有这部分代码:
o.Show();
o.listBox1.SelectedIndex = listBox1.SelectedIndex;
NeedsToClose = false;
this.Close();
我想让它变为函数(void),向它传递一个对象,然后得到一个结果。有什么想法可以做到吗?
这两个表单都派生自一个名为Template的表单,该表单派生自类form.
有两种方法可以使其工作——静态类型化和动态类型化。
以静态类型化的方式,您可以创建一个涵盖Light
和Acceleration
形式之间共性的接口,特别是它们都具有listBox1
这一事实。这将允许C#在编译时检查所述共性的存在。假设基类形式Template
有listBox1
,可以这样做:
Template nextForm;
if (listBox1.SelectedItem.ToString()=="Light" && Form.ActiveForm.Name != "Light") {
nextForm = new Light();
} else if(listBox1.SelectedItem.ToString() == "Acceleration"&& Form.ActiveForm.Name !="Acceleration") {
nextForm = new Acceleration();
}
nextForm.Show();
nextForm.listBox1.SelectedIndex = listBox1.SelectedIndex;
NeedsToClose = false;
this.Close();
在一个动态类型的解决方案中,您可以让C#跳过检查,并理解如果没有公共部分,程序在运行时会失败。该解决方案与上述相同,只是使用关键字dynamic
代替常见类型的名称:
dynamic nextForm;
... // the rest is the same
我想改进的几个地方@dasblinkenlight答案,
{
Template nextForm = GetForm();
if(nextForm == null)
return; // throw exception otherwise
ShowNextForm(nextForm);
NeedsToClose = false;
this.Close();
}
private Template GetForm()
{
string selectedItem = listBox1.SelectedItem.ToString();
string activeFormName = Form.ActiveForm.Name;
Template nextForm;
if (selectedItem =="Light" && activeFormName != "Light") {
nextForm = new Light();
} else if(selectedItem == "Acceleration"&& activeFormName !="Acceleration") {
nextForm = new Acceleration();
}
return nextForm;
}
private Template ShowNextForm(Template nextForm)
{
nextForm.Show();
nextForm.listBox1.SelectedIndex = listBox1.SelectedIndex;
}