Convert.ChangeType不能處理Nullable類型的解決辦法(轉)
阿新 • • 發佈:2018-12-27
value 解決 sta clas tty span oid pub https
{
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;
}
}
https://www.cnblogs.com/patrickyu/p/3211115.html
在做一個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;
{
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;
}
}
Convert.ChangeType不能處理Nullable類型的解決辦法(轉)