我创建了对象类的列表并从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.");
}
答案 0 :(得分:0)
你必须抓住每次迭代,而不是包裹循环。
答案 1 :(得分:0)
您可以使用LINQ中的可扩展.ToList()
方法将数据表传递给列表。
答案 2 :(得分:0)
Customer
是否继承BusinessObject
?
public class Customer : BusinessObject
并且,您是否正确覆盖了该方法(假设此类中的Load
方法的代码是BusinessObject
)?
protected override void Load(DataRow row)
另外,我注意到Load
方法是protected
,看起来您正在Load
上调用公开t
方法。这可能会导致对实际调用的方法产生一些混淆,因为您无法使用公共方法覆盖受保护的方法(编译器错误:Inconsistent accessibility: base class 'BaseClass.ProtectedMethod' is less accessible than class 'DerivedClass.ProtectedMethod'
)。
答案 3 :(得分:0)
您在Customer类中是否有类似这样的方法?
protected override void Load(DataRow row)
{
...
}
此外,您是否可以将BusinessObject类设为抽象并使Load方法abstract
而不是virtual
来确保不会发生这种情况?