開發中 很多人都會使用BLL Model這種開發,我也是,雖然現在有很多的自動生成工具,能在幾秒內生成cs的模板,但我個人還不是很喜歡,我還是喜歡自己一個一個去寫,這樣更能了解自己的代碼。
不過手動編寫的時候,最討厭的就是GetModel這類方法了,把datarow的數據轉換成一個Model,實在寫的我頭疼,因為很多代碼基本上都是一樣的,一直想用反射來寫這樣一個方法,以後只要調用一個方法就能完成Model的賦值,那樣就方便了。今天又遇到此類代碼了,一時火大,自己寫了個方法,采用的反射的原理(從BlogEngine裡學來的),或許這個方法比較笨拙,或許有其他更好的方法來實現,不過目前是能滿足我的GetModel的需求了,也就湊活著放上來,希望大家能給我更好的建議。
廢話不說了 代碼如下:
public class ModelHelper <T> where T : new()
{
public static T ConvertModel(DataRow dr)
{
T t = new T();
Type modelType = t.GetType();
foreach (PropertyInfo p in modelType.GetProperties())
{
p.SetValue(t, GetDefaultValue(dr[p.Name], p.PropertyType), null);
}
return t;
}
private static object GetDefaultValue(object obj, Type type)
{
if (obj == DBNull.Value)
{
obj = default(object);
}
else
{
obj = Convert.ChangeType(obj, type);
}
return obj;
}
}
范例:
Model model = ModelHelper<Model>.ConvertModel(DataRow)
ConvertModel靜態方法就是轉換的,GetDefaultValue方法則是獲取object的默認值的,因為從DataRow裡取到的值,有時候是DBNull,如果直接賦值的話會Throw錯誤的。
不好的地方:
1、Model類必須與DataRow的列名一一對應
2、Model類我設定了必須要有析構器的
代碼或許不是很理想,希望大俠們指點一二。
Email:[email protected]