对象列表未正确加载?

时间:2011-11-10 16:12:44

标签: c# asp.net

我创建了对象类的列表并从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.");
    }

4 个答案:

答案 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来确保不会发生这种情况?