開發中很多人都會使用 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 方法則是取得物件的預設值的,因為從 DataRow 裡取到的值,有時候是 DBNull,如果直接賦值的話會 Throw 錯誤的。
不好的地方:
DataRow 的欄位名一一對應程式碼或許不是很理想,希望大俠們指點一二。
Email: dally_2000@163.com