首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

自定義數據對象與 DataTable 無縫融合(二):集合層實現

     編輯:關於.NET

承接上篇(實體與 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));
}

完整 ObjectList 代碼結構

實現 IList(Add/Insert/Remove/Indexer 等)、ICollection、IEnumerable 全套接口,內部委託 ArrayList,同步更新 DataTable。可通過泛型包裝器提供強類型體驗。

VS2005 測試創建 100 萬對象,內存/CPU 消耗與普通對象接近。代碼生成建議使用 CodeSmith 模板自動化,提升開發效率與正確性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved