Ссылка на производный объект в базовом классе - PullRequest
0 голосов
/ 20 декабря 2011

У меня есть вспомогательный класс для отображения данных, который использует обобщения и отражения.

Поскольку я использую отражение и обобщения в своем вспомогательном классе, код для стандартных операций 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);
    }

1 Ответ

2 голосов
/ 20 декабря 2011

Только что разыграть this до T:

dataUtils.CreateParams((T)this, true);

Если вы создадите public class Evil : BusinessObject<Good>, это вызовет исключение InvalidCastException.

...