У меня есть вспомогательный класс для отображения данных, который использует обобщения и отражения.
Поскольку я использую отражение и обобщения в своем вспомогательном классе, код для стандартных операций CRUD идентичен для всех моих бизнес-объектов (как видно из метода базового класса Create (), поэтому я пытаюсь использовать базовый класс BusinessObject для обработки повторяющихся методов.
Я хочу, чтобы базовый класс мог вызывать мои универсальные методы DataUtils,которые, например, принимают ссылку на производный объект бизнес-объекта для заполнения параметров SQL.
DataUtils.CreateParams ожидает объект типа T и тип bool (указывает на вставку или обновление).
Iхочу передать «this», представляющий мой производный объект, базовый класс, но я получаю ошибку компиляции «Наилучшее перегруженное совпадение содержит недопустимые параметры».
Если я реализую Create () в производном классе, ипередать метод Create базового класса ссылку на «это», он работает - но тогда я все еще реализую все CRUD мидентичные методы в каждом классе бизнес-объектов.Я хочу, чтобы базовый класс обрабатывал их.
Возможно ли, чтобы базовый класс вызвал метод и передал ссылку на производный объект?
Вот мой базовый класс:
public abstract class BusinessObject<T> where T:new()
{
public BusinessObject()
{ }
public Int64 Create()
{
DataUtils<T> dataUtils = new DataUtils<T>();
string insertSql = dataUtils.GenerateInsertStatement();
using (SqlConnection conn = dataUtils.SqlConnection)
using (SqlCommand command = new SqlCommand(insertSql, conn))
{
conn.Open();
//this line is the problem
command.Parameters.AddRange(dataUtils.CreateParams(obj, true));
return (Int64)command.ExecuteScalar();
}
}
}
}
И производный класс:
public class Activity: BusinessObject<Activity>
{
[DataFieldAttribute(IsIndentity=true, SqlDataType = SqlDbType.BigInt)]
public Int64 ActivityId{ get; set; }
///...other mapped fields removed for brevity
public Activity()
{
ActivityId=0;
}
//I don't want to have to do this...
public Int64 Create()
{
return base.Create(this);
}