2015-10-30 3 views
2

Так что это мой код:Передача неизвестного типа объекта в функции

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(); 

I хотел бы сделать его функцией (void) вместо этого, передать ему объект и получить результат. Любые идеи, как это можно сделать?

Обе формы получены из формы Template, которая происходит из класса Form.

+1

Если предположить, что 'Acceleration' и «Свет» вытекают из общего класса, который происходит от «Формы»? –

+0

Из другой родительской формы Вызываемый шаблон –

+0

Каким будет возвращаемое значение? Логическое? –

ответ

2

Существует два способа заставить это работать - статически типизированное и динамически типизированное.

В статически типизированном виде вы создадите интерфейс, который охватывает общие черты между формами 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 
+0

+1, более подход ООП заключался бы в том, чтобы предложить ему создать интерфейс, возможно, «ISpeed», а затем позволить объектам «свет», «скорость» реализовать его, затем по интерфейсу он может динамически создавать объект .. возможно, вы можете добавить его в ваш ответ :) – Mathematics

+0

Хорошо, я вижу, что это «динамический» - это правильный путь для меня –

+0

@ ДмитрийКовалёв Это зависит от ваших личных предпочтений. 'dynamic' определенно более легкий в кодировании, но использование его происходит за счет снижения количества проверок компилятора. Например, если вы или кто-то, кто модифицирует ваш код, решает дать 'listBox1' лучшее имя для зондирования в одной из форм, ваш' dynamic'-код будет продолжать компилироваться, но он сломается, как только он попытается установить 'listBox1 'который был переименован. – dasblinkenlight

1

несколько битов, которые я хотел улучшить @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; 
} 
Смежные вопросы