2011-11-10 48 views
0

我创建了对象类列表并从CreateListFromTable方法返回。但总是虚拟方法正在调用并抛出异常。数据未加载到列表中。对象列表无法正确加载?

可能是什么问题?

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方法。这可能会导致一些混淆,因为您无法使用公共方法覆盖受保护的方法(编译器错误: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的抽象类,让Load方法abstract而不是virtual,以确保不会发生这种情况?