2011-11-10 6 views
0

作成しましたオブジェクトクラスのリストとCreateListFromTableメソッドからの戻り値です。しかし、常にVirtualメソッドは、呼び出しと例外のスローです。データがリストに読み込まれていません。オブジェクトの一覧が正しく読み込まれていませんか?

何が問題なのですか?

public static List<Customer> GetCustomer(string ID) 
    { 
     DataTable dt = new DataTable(); 
     try 
     { 
      DatabaseGateway da = new DatabaseGateway(); 
      dt = da.QueryForDataTable("proc_GetCustomer", ID);     
     } 
     catch (Exception ex) 
     { 
      LogMessage(ex.Message + ": " + ex.StackTrace, EventLogEntryType.Error); 
     } 

     return CreateListFromTable<Customer>(dt);   


    } 

protected static List<T> CreateListFromTable<T>(DataTable dt) where T : BusinessObject, new() 
    { 
     List<T> list = new List<T>(); 
     try 
     {   
      if (dt != null) 
      foreach (DataRow row in dt.Rows) 
      { 
       T t = new T(); 
       t.Load(row); 
       list.Add(t); 
      } 
     } 
     catch (Exception exception) 
     { 


     } 
     return list; 
    } 
    /// <summary> 
    /// Virtual method which should be overriden by inherited types that support loading. 
    /// </summary> 
    /// <param name="row"></param> 
    protected virtual void Load(DataRow row) 
    { 
     throw new NotSupportedException("The object of type '" + this.GetType().Name + 
      "' does not support loading from DataRow."); 
    } 
+1

例外は何ですか? – GazTheDestroyer

+0

{"タイプ 'Customer'のオブジェクトは、DataRowからの読み込みをサポートしていません。"} – James123

答えて

0

Customerは、BusinessObjectを継承していますか?

public class Customer : BusinessObject 

そして、あなたが適切にメソッドをオーバーライドします(このクラスからLoadメソッドのコードをされたと仮定しBusinessObjectですか)?

protected override void Load(DataRow row) 

また、私はLoad方法がprotectedであることに気づいて、あなたがtのパブリックLoadメソッドを呼び出しているように見えます。これは、publicメソッドで保護されたメソッドをオーバーライドできないため、実際に呼び出されているメソッドが混乱する原因となります(コンパイラエラー:Inconsistent accessibility: base class 'BaseClass.ProtectedMethod' is less accessible than class 'DerivedClass.ProtectedMethod')。

0

ループをラップする代わりに、繰り返しごとにキャッチする必要があります。

+0

他のクラスは顧客用ではありません。 – James123

0

LINQで拡張可能なメソッド.ToList()を使用して、データテーブルをリストに渡すことができます。

0

Customerクラスでは次のような方法がありますか?また

protected override void Load(DataRow row) 
{ 
    ... 
} 

、あなたはてBusinessObjectクラスは抽象的にし、これが起こらないことを保証するために、代わりにvirtualのLoadメソッドabstractを作ることができますか?

関連する問題