呃```花了一晚上時間,終于搞出來了如何通過反射,從datareader將數據填充到數據實體泛型集合的靜態方法.
//kchen.core.basebusinessobject為通用數據實體類,此處僅為限定t所繼承的類型
public static ilist<t> filldatalistgeneric<t>(system.data.idatareader reader) where t : kchen.core.basebusinessobject
{
//實例化一個list<>泛型集合
ilist<t> datalist = new list<t>();
while (reader.read())
{
//由于是是未知的類型,所以必須通過activator.createinstance<t>()方法來依據t的類型動態創建數據實體對象
t rowinstance = activator.createinstance<t>();
//通過反射取得對象所有的property
foreach (propertyinfo property in typeof(t).getproperties())
{
//bindingfieldattribute為自定義的attribute,用于與數據庫字段進行綁定
foreach (bindingfieldattribute fieldattr in property.getcustomattributes(typeof(bindingfieldattribute), true))
{
try
{
//取得當前數據庫字段的順序
int ordinal = reader.getordinal(fieldattr.fieldname);
if (reader.getvalue(ordinal) != dbnull.value)
{
//將datareader讀取出來的數據填充到對象實體的屬性里
property.setvalue(rowinstance, convert.changetype(reader.getvalue(ordinal), property.propertytype), null);
}
}
catch
{
break;
}
}
}
//將數據實體對象add到泛型集合中
datalist.add(rowinstance);
}
return datalist;
}
調用的時候使用如下代碼
//偽代碼 oledbdatareader _ds = 創建一個oledbdatareader
ilist<product> _result = kchen.utilities.filldatalistgeneric<product>(_ds);
此靜態方法通過一個實體類型和datereader,快速的將數據填充到數據實體泛型集合中.
新聞熱點
疑難解答