C# 未正确加载的对象列表?

C# 未正确加载的对象列表?,c#,asp.net,C#,Asp.net,我创建了对象类的列表,并从CreateListFromTable方法返回。但虚拟方法总是调用并抛出异常。数据未加载到列表中 有什么问题吗 public static List<Customer> GetCustomer(string ID) { DataTable dt = new DataTable(); try { DatabaseGateway da = new DatabaseGateway()

我创建了对象类的列表,并从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.");
    }
公共静态列表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加载。”}