C# 未正确加载的对象列表?
我创建了对象类的列表,并从CreateListFromTable方法返回。但虚拟方法总是调用并抛出异常。数据未加载到列表中 有什么问题吗C# 未正确加载的对象列表?,c#,asp.net,C#,Asp.net,我创建了对象类的列表,并从CreateListFromTable方法返回。但虚拟方法总是调用并抛出异常。数据未加载到列表中 有什么问题吗 public static List<Customer> GetCustomer(string ID) { DataTable dt = new DataTable(); try { DatabaseGateway da = new DatabaseGateway()
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.");
}
公共静态列表GetCustomer(字符串ID)
{
DataTable dt=新的DataTable();
尝试
{
DatabaseGateway da=新的DatabaseGateway();
dt=da.queryfordataable(“proc_GetCustomer”,ID);
}
捕获(例外情况除外)
{
LogMessage(ex.Message+:“+ex.StackTrace,EventLogEntryType.Error);
}
返回CreateListFromTable(dt);
}
受保护的静态列表CreateListFromTable(DataTable dt),其中T:BusinessObject,new()
{
列表=新列表();
尝试
{
如果(dt!=null)
foreach(数据行中的数据行)
{
T=新的T();
t、 荷载(row);
列表。添加(t);
}
}
捕获(异常)
{
}
退货清单;
}
///
///应被支持加载的继承类型覆盖的虚拟方法。
///
///
受保护的虚拟无效负载(数据行)
{
抛出新的NotSupportedException(“类型为“”的对象+this.GetType().Name+
“'不支持从DataRow加载。”);
}
您必须捕获每个迭代,而不是包装循环。您可以使用LINQ中的方法extensible.ToList()
将数据表传递到列表。客户是否继承BusinessObject
public class Customer : BusinessObject
protected override void Load(DataRow row)
并且,您是否正确地重写了该方法(假设该类中Load
方法的代码为BusinessObject
)
另外,我注意到
Load
方法是protected
,看起来您在t
上调用了一个公共Load
方法。由于无法用公共方法重写受保护的方法,这可能会导致一些关于实际调用哪些方法的混淆(编译器错误:不一致的可访问性:基类“BaseClass.ProtectedMethod”的可访问性低于类“DerivedClass.ProtectedMethod”
).在Customer类中是否有类似的方法
protected override void Load(DataRow row)
{
...
}
另外,能否将BusinessObject类抽象化,并将Load方法抽象化
而不是虚拟化
,以确保不会发生这种情况?{“Customer”类型的对象不支持从DataRow加载。”}