2012-02-23 23 views
0

指定されたタイプに従って値を返す関数を作成しました。タイプ関数を実装するにはどうすればいいですか?

コード:

private T FindCellValue<T>(GridViewRow grdRow, string cntName) 
     { 
      var currColType = grdRow.FindControl(cntName); 
      object val = currColType; 
      if (currColType is HiddenField) 
      { 
       val = ((HiddenField)currColType).Value; 
      } 
      if (currColType is TextBox) 
      { 
       val = ((TextBox)currColType).Text; 
      } 
      if (currColType is HtmlInputText) 
      { 
       val = ((HtmlInputText)currColType).Value; 
      } 
      if (currColType is DropDownList) 
      { 
       var selectedItem = ((DropDownList)currColType).SelectedItem; 
       val = new string[] { selectedItem.Text, selectedItem.Value }; 
      } 
      if (currColType is RadDateTimePicker) 
      { 
       val = ((RadDateTimePicker)currColType).SelectedDate; 
      } 

      if (!(val is Control || val is WebControl || val is HtmlInputControl) && string.IsNullOrEmpty(Convert.ToString(val))) 
      { 
       return default(T); 
      } 
      return (T)val; 
     } 

型キャストしながら、このコードは、多くの時間を失敗しました。それを効率的な方法で実装するにはどうしたらいいですか?

答えて

1

Tがコントロールの値と一致しない場合、 どのようなエラー処理が必要ですか?デフォルト(T)を返すか、例外をスローしますか?

は、少なくとも

if (currColType is DropDownList) 
{ 
    if (typeof(T) != typeof(string[])) 
     return default(T); //or throw exception 
} 

if (currColType is RadDateTimePicker) 
{ 
    if (typeof(T) != typeof(DateTime)) 
     return default(T); //or throw exception 
} 
1

ジェネリック型は、あなたのコードを再利用し、実行時の鋳造コストを回避するために使用されるが、あなたの場合、そのない場合にはされて確認してください。このコンテキストでは、オブジェクトを返す単純な関数を使用することができます。次に、関数を呼び出して、目的の型にキャストします。エラー処理のため

: あなたは型キャストは、あなたが同じかどうかを確認することができますので、それはInvalidCastExceptionが返されます成功していない場合 (タイプ)Objectとして、あなたのオブジェクトをキャストすると入力した場合。

また、型キャストの演算子として使用し、null値をチェックすると、メソッドの方が速いことになります。

関連する問題