2011-06-21 5 views
-1

私は唯一の他のPARAMためのテキストボックスまたはDDLおよびヌルのいずれかを渡すことができる方法タイプ

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

を有します。この問題を解決するにはどうすればよいですか? 動的に私はそのメソッドを呼び出し、TextBoxまたはDDlのいずれかが存在します。だから、私はそのコントロールから価値を返さなければならない。

Nullを渡すと、メソッドに無効な引数が含まれているというエラーメッセージが表示されます。

+5

正確に達成しようとしていることはありますか? –

+1

あなたは何をしたいのですか? – DeveloperX

+0

したがって、パラメータの1つはnullでなければならず、もう一方の値を返す必要があります。 –

答えて

6

テキストボックスまたはddlのいずれか一方のみを渡し、もう一方のパラメータはnullを渡すことができます。この問題を解決するにはどうすればよいですか?

これは、適用するビジネスルールである場合、解決しない場合は変更します。メソッドのオーバーロードを使用して、実際に使用するパラメータの型のみを受け入れます。

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

私はこのような方法を行うべきではないと思います。

あなたは

txtMyText.Text;

に値を設定したり、ddl.SelectedValue;

ここで問題に値を設定します

var value = GetValue(null, ddlMyList); 

を持って

var value = GetValue(txtMyText, null); 

のようないくつかのコードを持って署名から、これは読みやすさを取り除くということです。あなたのコードを読んでいるときにGetValue()をやっているのが分かりますが、なぜいくつかのパラメータでnullを渡す理由が分かりません。

だけで参照するには、コードを読むときには、実際にはかなり明らかだ:あなたは一人ひとりの制御タイプを処理する必要があるため、このメソッドを作る

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

は、本当にすべてが有用ではありません。クラスにはすでに値を取得するメソッドがあり、クラス型に関係なく値を取得するユーティリティメソッドを作成しようとすると、実際に何が起こっていないのかがわかりにくくなります。

さらに、このメソッドにさらに型を追加すると、型を見つけるまでIf/Elseを終了し、値を返します。これは、すでに設計時に種類を知っている、特に以来、不要なCPUサイクルが発生する(あなたは一つのパラメータにnullを渡しているからです。)

1

あなたはの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

すべてのコントロールとしてメソッドを呼び出すには、クラスcontrolを継承します。したがって、1つのパラメータで十分です。タイプを決定するだけです:

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