承接上篇(實體與 DataRow 綁定),本文實現對應 DataTable 的強類型集合 ObjectList,支持序列化、多態、高性能行遷移。
IList、ISerializable,內部用 ArrayList 存儲實體。DataTable 作為集合數據容器,實體入集合時將其 DataRow 從實體私有表遷移至集合表。ItemArray 整體賦值 + NewRow,比逐列複製快 1 倍以上(時間/內存)。
private void AddObjectRowToListTable(IDataObject obj)
{
if (m_dataTable == null) m_dataTable = obj.DataContainer.Clone();
DataRow newRow = m_dataTable.NewRow();
newRow.ItemArray = obj.ObjectRow.ItemArray; // 關鍵:整體複製
m_dataTable.Rows.Add(newRow);
obj.ObjectRow.Delete();
obj.ObjectRow.Table.AcceptChanges();
obj.ObjectRow = newRow;
}
DataTable。DataTable,按行創建實體實例(Activator.CreateInstance(type, row)),自動綁定 DataRow。
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
if (m_list.Count >= 0) info.AddValue("DataObjectType", m_list[0].GetType());
info.AddValue("DataTable", m_dataTable, typeof(DataTable));
}
protected ObjectList(SerializationInfo info, StreamingContext context)
{
m_dataTable = info.GetValue("DataTable", typeof(DataTable)) as DataTable;
Type t = info.GetValue("DataObjectType", typeof(Type)) as Type;
if (t != null)
foreach (DataRow dr in m_dataTable.Rows)
m_list.Add(Activator.CreateInstance(t, dr));
}
實現 IList(Add/Insert/Remove/Indexer 等)、ICollection、IEnumerable 全套接口,內部委託 ArrayList,同步更新 DataTable。可通過泛型包裝器提供強類型體驗。
VS2005 測試創建 100 萬對象,內存/CPU 消耗與普通對象接近。代碼生成建議使用 CodeSmith 模板自動化,提升開發效率與正確性。