核心問題:如何將 DbDataReader 逐欄位映射到未知型別 T 的屬性?答案是反射。
for (int i = 0; i < reader.FieldCount; i++)
{
PropertyInfo p = obj.GetType().GetProperty(reader.GetName(i));
if (reader.GetValue(i) != DBNull.Value)
p.SetValue(obj, reader.GetValue(i), null);
}
class ReaderHelper
{
public static object ReaderToObject(DbDataReader reader, object obj)
{
Type t = obj.GetType();
if (t.Equals(typeof(CommonObject))) // 特殊型別處理
{
for (int i = 0; i < reader.FieldCount; i++)
{
PropertyInfo p = obj.GetType().GetProperty("Co" + (i+1));
if (reader.GetValue(i) != DBNull.Value)
p.SetValue(obj, reader.GetValue(i), null);
}
}
else
{
for (int i = 0; i < reader.FieldCount; i++)
{
PropertyInfo p = obj.GetType().GetProperty(reader.GetName(i));
if (reader.GetValue(i) != DBNull.Value)
p.SetValue(obj, reader.GetValue(i), null);
}
}
return obj;
}
}
已知限制:屬性名需與資料庫欄位名完全一致(大小寫敏感),不支援巢狀物件、別名映射,後續需引入 Attribute 或 Convention 改進。