将未知类型的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.

将未知类型的Object传递给函数

有两种方法可以使其工作——静态类型化和动态类型化。

以静态类型化的方式,您可以创建一个涵盖LightAcceleration形式之间共性的接口,特别是它们都具有listBox1这一事实。这将允许C#在编译时检查所述共性的存在。假设基类形式TemplatelistBox1,可以这样做:

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;
}