在做一个ORMapping功能的时候发现,Convert.ChangeType不能处理nullable类型,比如int?.
解决办法也很简单,贴出完整的代码(大部分代码来自网络),注意下面代码没经过完整测试,不要直接用在项目里:
public delegate void SetValue<T>(T value);
public static class ORMapping<T> where T : class, new()
{
private static Delegate CreateSetDelegate(T model, string propertyName)
{
MethodInfo mi = model.GetType().GetProperty(propertyName).GetSetMethod();
//这里构造泛型委托类型
Type delType = typeof(SetValue<>).MakeGenericType(GetPropertyType(propertyName));
return Delegate.CreateDelegate(delType, model, mi);
}
private static Type GetPropertyType(string propertyName)
{
return typeof(T).GetProperty(propertyName).PropertyType;
}
public static IList<T> ConvertToBusinessEntityList(DataTable dt)
{
IList<T> list = new List<T>();
if (dt == null || dt.Rows.Count < 1) return list;
Delegate setDelegate;
foreach (DataRow dr in dt.Rows)
{
T model = new T();
foreach (DataColumn dc in dt.Columns)
{
setDelegate = CreateSetDelegate(model, dc.ColumnName);
Type type = GetPropertyType(dc.ColumnName);
Type underlyingType = Nullable.GetUnderlyingType(type);
if (DBNull.Value != dr[dc.ColumnName])
{
setDelegate.DynamicInvoke(Convert.ChangeType(dr[dc.ColumnName], underlyingType ?? type));
}
}
list.Add(model);
}
return list;
}
}
在做一个ORMapping功能的时候发现,Convert.ChangeType不能处理nullable类型,比如int?.
解决办法也很简单,贴出完整的代码(大部分代码来自网络),注意下面代码没经过完整测试,不要直接用在项目里:
public delegate void SetValue<T>(T value);
public static class ORMapping<T> where T : class, new()
{
private static Delegate CreateSetDelegate(T model, string propertyName)
{
MethodInfo mi = model.GetType().GetProperty(propertyName).GetSetMethod();
//这里构造泛型委托类型
Type delType = typeof(SetValue<>).MakeGenericType(GetPropertyType(propertyName));
return Delegate.CreateDelegate(delType, model, mi);
}
private static Type GetPropertyType(string propertyName)
{
return typeof(T).GetProperty(propertyName).PropertyType;
}
public static IList<T> ConvertToBusinessEntityList(DataTable dt)
{
IList<T> list = new List<T>();
if (dt == null || dt.Rows.Count < 1) return list;
Delegate setDelegate;
foreach (DataRow dr in dt.Rows)
{
T model = new T();
foreach (DataColumn dc in dt.Columns)
{
setDelegate = CreateSetDelegate(model, dc.ColumnName);
Type type = GetPropertyType(dc.ColumnName);
Type underlyingType = Nullable.GetUnderlyingType(type);
if (DBNull.Value != dr[dc.ColumnName])
{
setDelegate.DynamicInvoke(Convert.ChangeType(dr[dc.ColumnName], underlyingType ?? type));
}
}
list.Add(model);
}
return list;
}
}