我创建了一个函数,它根据指定的类型返回值。
代码:
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;
}
此代码在进行类型转换时失败很多次。我如何有效地实施它?
答案 0 :(得分: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 :(得分:1)
通用类型用于重用代码并避免运行时转换成本,但在您的情况下并非如此。因此,可以在此上下文中使用返回对象的简单函数。然后,您可以在调用函数类型中将其强制转换为所需类型。
错误处理: 如果您输入对象的类型 (type)对象如果类型转换不成功,它将返回invalidcastexception,因此您可以检查相同的内容。
你也可以使用as作为类型转换的运算符并检查null值,它会比上面的方法更快。