c#4.0-c#方法中参数的类型

本文关键字:类型 参数 0-c# 方法 c#4 | 更新日期: 2023-09-27 18:00:08

我有一个方法

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

我只能为另一个参数传递textbox或ddl和null。如何解决此问题?我动态地调用该方法,并且一次存在TextBox或DDl。因此,基于此,我必须从该控件返回值。

我收到一些错误消息,因为当我传递Null时,方法有无效的参数。

c#4.0-c#方法中参数的类型

我只能为另一个参数传递textbox或ddl和null。如何解决此问题?

如果这是您要强制执行的业务规则,您不解决它,而是更改它。使用方法重载只接受您实际要使用的参数类型。

public string GetValue(TextBox tb)
public string GetValue(DropDownList ddl)

我认为不应该使用这样的方法。

从签名你有一些代码像

var value = GetValue(txtMyText, null);

将值设置为txtMyText.Text;

或者你有

var value = GetValue(null, ddlMyList);

将值设置为ddl.SelectedValue;

这里的问题是这会删除可读性。当我阅读你的代码时,我看到你在做GetValue(),但我不知道为什么你在一些参数中传递null。

事实上,这是相当清楚的,当阅读代码时只看到:

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

制作这个方法并没有那么有用,因为你必须处理每一种控件类型。类已经有了获取其值的方法,而您试图编写一个实用程序方法来获取值,而不管类类型如何,这会掩盖实际发生的事情。

此外,如果向该方法添加更多类型,则最终将执行if/Else,直到找到类型并返回值。这会导致不必要的CPU周期,尤其是因为您在设计时就已经知道了类型(因为您为一个参数传递了null)。

如果您想传递许多参数,可以使用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);

每个控件都继承类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 "";
}