Список объектов не загружается должным образом?

#c# #asp.net

#c# #asp.net

Вопрос:

Я создал список класса объекта и возвращаюсь из метода 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. {«Объект типа ‘Customer’ не поддерживает загрузку из DataRow».}

Ответ №1:

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' ).

Ответ №2:

Вы должны перехватывать для каждой итерации, вместо того, чтобы завершать цикл.

Ответ №3:

Вы можете использовать метод extensible .ToList() в LINQ, чтобы передать datatable в список.

Ответ №4:

Есть ли у вас в классе Customer метод, который выглядит подобным образом?

 protected override void Load(DataRow row)
{
    ...
}
  

Кроме того, не могли бы вы сделать класс BusinessObject абстрактным и создать метод Load abstract вместо virtual , чтобы гарантировать, что этого не произойдет?