Тип параметров в методах c # - PullRequest
0 голосов
/ 21 июня 2011

У меня есть метод

public string GetValue(TextBox txt, DropdownList ddl)
{
    if(txt != null)
        return txt.text;
    else
        return ddl.SelectedValue;
}

Я могу передать только текстовое поле или ddl и ноль для другого параметра. Как я могу решить эту проблему? Динамически я вызываю этот метод, и в то же время существует TextBox или DDl. На основании этого я должен вернуть значение из этого элемента управления.

Я получаю сообщение об ошибке, так как метод имеет недопустимые аргументы, когда я передаю ноль.

Ответы [ 4 ]

6 голосов
/ 21 июня 2011

Я могу передать только текстовое поле или ddl и ноль для другого параметра. Как я могу решить эту проблему?

Если это бизнес-правило, которое вы хотите применить, вы не разрешаете его, вы меняете его. Используйте перегрузку метода, чтобы принимать только тот тип параметра, который вы действительно хотите использовать.

public string GetValue(TextBox tb)
public string GetValue(DropDownList ddl)
2 голосов
/ 21 июня 2011

Я не думаю, что вы должны делать метод, подобный этому.

Из подписи у вас есть некоторый код типа

var value = GetValue(txtMyText, null);

, который устанавливает значение в txtMyText.Text;

ИЛИ у вас есть

var value = GetValue(null, ddlMyList);

, который устанавливает значение ddl.SelectedValue;

Проблема здесь в том, что это устраняет читабельность.Когда я читаю ваш код, я вижу, что вы выполняете GetValue (), но я в растерянности из-за того, что вы передаете нуль в некоторых параметрах.просто код:

var value = txtMyTextBox.Text;
var dropDownValue = ddlMyList.SelectedValue;

Создание этого метода на самом деле не так уж и полезно, потому что вы должны обрабатывать каждый тип элемента управления.У классов уже есть методы для получения их значения, и вы пытаетесь написать вспомогательный метод, который получит значение независимо от типа класса, затеняет то, что действительно происходит с небольшим значением.

Далее, если вы добавите больше типовв этом методе вы будете выполнять If / Else, пока не найдете тип и не вернете значение.Это вызывает ненужные циклы ЦП, тем более что вы уже знаете тип во время разработки (поскольку вы передаете ноль для одного параметра.)

1 голос
/ 21 июня 2011

если вы хотите передать много параметров, вы можете использовать ключевое слово param

public string GetValue(params object[] controls)
{
    foreach (var item in controls)
    {
        if (item != null)
        {
            if (item is TextBox)
                return (item as TextBox).Text;
            if (item is CheckBox)
                return (item as CheckBox).Checked.ToString();

            if (item is DropDownList)
                return (item as DropDownList).SelectedValue.ToString();
        }
    }
    return string.Empty;
}

и вызовите метод следующим образом:

            GetValue(TextBox1);
            GetValue(DropDownList1);
 GetValue(CheckBox1);
      GetValue(null,DropDownList1);
      GetValue(TextBox1,DropDownList1);
  GetValue(TextBox1,DropDownList1,CheckBox1);
0 голосов
/ 21 июня 2011

Каждый элемент управления наследует класс control. Так что одного параметра достаточно. Вам просто нужно определить тип:

public string GetValue(Control ctl) {
  if (ctl != null) {

    //Textbox
    if (ctl is TextBox) return ctl.Text;
    //Combobox
    if (ctl is ComboBox) {
      ComboBox cb = ctl as ComboBox;
      return cb.SelectedText;
    }
    //...
  }
  //Default Value (You can also throw an exception
  return "";
}
...