前言
小编最近在做机房合作的项目,在合代码调试的时候遇见了这样一个问题,无法将类型XX隐式转换为泛型。刚开始遇到这个问题的时候并没有想为什么会出现这个问题,只是带着问题去查解决方案了,找到解决方案之后才发现了为什么会出现这个问题。下面就简单的介绍一下为什么会遇到这个问题以及问题的解决方案
由来
由于小编在合作开发的时候是负责B层和工厂的。B层处理一些逻辑判断,SQLhelper里面增删改的方法是int类型的,我在B层是用泛型接收的,所以才会出现这个问题。至于当时为什么会用泛型去接收可能是脑子进水了。
解决方案
在B层建一个转换的类,在用泛型接收之前先调用这个类转换一下就没有问题了,下面是具体代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
namespace BLL
{
class Utility
{
public static T ConvertDataRow(DataRow dr, string columnName,T defaultValue)
{
if (dr.Table.Columns.Contains(columnName))
{
return ConvertType(dr[columnName],defaultValue);
}
return default(T);
}
///
/// 泛型数据类型转换
///
/// 自定义数据类型
/// 传入需要转换的值
/// 默认值
///
public static T ConvertType(object value,T defaultValue)
{
try
{
return (T)ConvertToT(value,defaultValue);
}
catch
{
return default(T);
}
}
///
/// 转换数据类型
///
/// 自定义数据类型
/// 传入需要转换的值
/// 默认值
///
private static object ConvertToT(object myvalue,T defaultValue)
{
TypeCode typeCode = System.Type.GetTypeCode(typeof(T));
if (myvalue != null)
{
string value = Convert.ToString(myvalue);
switch (typeCode)
{
case TypeCode.Boolean:
bool flag = false;
if (bool.TryParse(value, out flag))
{
return flag;
}
break;
case TypeCode.Char:
char c;
if (Char.TryParse(value, out c))
{
return c;
}
break;
case TypeCode.SByte:
sbyte s = 0;
if (SByte.TryParse(value, out s))
{
return s;
}
break;
case TypeCode.Byte:
byte b = 0;
if (Byte.TryParse(value, out b))
{
return b;
}
break;
case TypeCode.Int16:
Int16 i16 = 0;
if (Int16.TryParse(value, out i16))
{
return i16;
}
break;
case TypeCode.UInt16:
UInt16 ui16 = 0;
if (UInt16.TryParse(value, out ui16))
return ui16;
break;
case TypeCode.Int32:
int i = 0;
if (Int32.TryParse(value, out i))
{
return i;
}
break;
case TypeCode.UInt32:
UInt32 ui32 = 0;
if (UInt32.TryParse(value, out ui32))
{
return ui32;
}
break;
case TypeCode.Int64:
Int64 i64 = 0;
if (Int64.TryParse(value, out i64))
{
return i64;
}
break;
case TypeCode.UInt64:
UInt64 ui64 = 0;
if (UInt64.TryParse(value, out ui64))
return ui64;
break;
case TypeCode.Single:
Single single = 0;
if (Single.TryParse(value, out single))
{
return single;
}
break;
case TypeCode.Double:
double d = 0;
if (Double.TryParse(value, out d))
{
return d;
}
break;
case TypeCode.Decimal:
decimal de = 0;
if (Decimal.TryParse(value, out de))
{
return de;
}
break;
case TypeCode.DateTime:
DateTime dt;
if (DateTime.TryParse(value, out dt))
{
return dt;
}
break;
case TypeCode.String:
if (!string.IsNullOrEmpty(value))
{
return value.ToString();
}
break;
}
}
return defaultValue;
}
}
}
结语
遇到问题应该先去思考为什么会出现这个问题,那么这样解决问题的效率就会很高。走弯路也可以学到很多东西,只不过解决问题时间比较长而已,两种不同的思维方式