2016-02-28 70 views
0

我面临一个问题,我无法弄清楚如何管理。关于继承和铸

我开发了一个在DataTable上实现非唯一索引的类;处理商品,我想发展我IndexedTable的是,obviousvly,从DataTable继承,添加一个方法使用非唯一索引

我写信给执行表上的搜索:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Data; 

namespace DWH_Core 
{ 
    class IndexedTable : DataTable 
    { 
     //private DataTable m_tbl; 
     //public Dictionary<Int32, Int32> idx; 

     private Index_NonUnique m_idx = null; 
     public void buildNonUniqueIndex(string keyField) 
     { 
      m_idx = new Index_NonUnique(); 
      m_idx.buildIndex(this, keyField); 

      return; 
     } 

     public DataRow[] search (string key) 
     { 
      return m_idx.search(key); 
     } 

     public DataRow[] search(int key) 
     { 
      return m_idx.search(key); 
     } 

     public DataRow[] search(short key) 
     { 
      return m_idx.search(key); 
     } 

    } 
} 

和相关类

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Data; 

namespace DWH_Core 
{ 
    class Index_NonUnique 
    { 
     private string m_KeyField; 
     private ILookup<object, DataRow> m_IdxByKey; 

     public void buildIndex(DataTable tbl, string keyField) 
     { 
      m_KeyField = keyField; 

      IEnumerable<DataRow> enumerable = tbl.AsEnumerable(); 
      m_IdxByKey = enumerable.ToLookup(o => o[keyField]); 
     } 


     public DataRow[] search(string keyValue) 
     { 
      return m_IdxByKey[keyValue].ToArray(); 
     } 

     public DataRow[] search(int keyValue) 
     { 
      return m_IdxByKey[keyValue].ToArray(); 
     } 

     public DataRow[] search(short keyValue) 
     { 
      return m_IdxByKey[keyValue].ToArray(); 
     } 
    } 
} 

的问题是,当我产生,在通常的方式一个DataTable类,并尝试将其转换为IndexedTable,我得到了运行时错误“无法从类型的对象执行投“SYSTE类型'DWH_Core.IndexedTable'中的“m.Data.DataTable”。 我不想使用private DataTable m_tbl成员,因为我想将所有DataTable成员应用到我的IndexedTable对象,但我无法理解如何管理此错误。 最后,我的目标是编写这样的事:

IndexedTable tmpTable = null; 
SqlCommand cmd = "SELECT * FROM SOME_TABLE" 
SqlDataReader rdr = cmd.ExecuteReader(); 

m_SAP_Allocazione = (IndexedTable)rdr.ToTable(); 
m_SAP_Allocazione.buildNonUniqueIndex("PERNR"); 

回答