У меня есть вспомогательный класс сопоставления данных, который использует обобщения и отражение.Ссылка на производный объект в базовом классе
Поскольку я использую отражение и обобщения в моем классе-помощнике, код для стандартных операций CRUD идентичен всем моим бизнес-объектам (как видно из метода базового класса Create()), поэтому я пытаюсь используйте базовый класс BusinessObject для обработки повторяющихся методов.
Я хочу, чтобы базовый класс мог вызвать мои общие методы DataUtils, которые, например, принимают ссылку на объект бизнес-объекта, чтобы заполнить параметры SQL.
DataUtils.CreateParams ожидает объект типа T и bool (указывает на вставку или обновление).
Я хочу передать «это», представляющий мой производный объект базовым классом, но я получаю ошибку компиляции «Лучшее перегруженное совпадение содержит недопустимые параметры».
Если я реализую Create() в производном классе и передаю метод Create базового класса ссылку на «this», он работает, но я все равно реализую все методы 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);
}
Ах, [CRTP] (http://blogs.msdn.com/b/ericlippert/archive/2011/02/03/curiouser-and-curiouser.aspx) – SLaks