2012-02-23 98 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的,所以你可以检查相同。

你也可以使用作为运算符进行类型转换并检查null值,它会比上面的方法更快。

相关问题