1. 程式人生 > >Convert.ChangeType不能處理Nullable類型的解決辦法(轉)

Convert.ChangeType不能處理Nullable類型的解決辦法(轉)

value 解決 sta clas tty span oid pub https

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;
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;
}
}

Convert.ChangeType不能處理Nullable類型的解決辦法(轉)