#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
, чтобы гарантировать, что этого не произойдет?