Как получить доступ к полям дочерних объектов из родительского объекта в C#?

Я использую Dapper.net в качестве ORM. У меня есть абстрактный класс BusinessObject, который наследуется от других классов, представляющих таблицы в моей базе данных, например, SubContractorJob.

У меня есть метод класса BusinessObject под названием "Persist", который сохраняет запись в базе данных:

public abstract class BusinessObject<T>
{
    public bool Persist<T>(IDbConnection db, T entity)
        where T : BusinessObject<T>, IDBObject
    {
        if (entity.Id > 0)
        {
            db.Update(entity);
            return true;
        }
        else
        {
            db.Insert(entity);
            return false;
        }
    }

}

В настоящее время, как вы можете видеть, метод Persist принимает объект в качестве входных данных.

Это означает, что когда я наследую от класса BusinessObject, я должен вызывать его следующим образом из моего дочернего объекта:

IDbConnection db = DBConnection.GetConnection();

    SubContractorJob s = new SubContractorJob()
            {
                Id = 3,
                SubContractorId = 6,
                JobId = 8,
                StartDate = DateTime.Today,
                EndDate = DateTime.Today.AddDays(10),
                EstimatedCost = 20000,
                ActualCost = 18000,
                IsDeleted = true
            }; 

s.Persist<SubContractorJob>(db, s);

Мой вопрос: как я могу сделать эту работу без необходимости передавать 's', когда я уже вызываю метод в контексте s (дочерний объект)?

У меня есть настроенный интерфейс (IDBObject), поэтому всегда гарантируется наличие в дочернем объекте поля Id.

Я попробовал это:

public bool Persist<T>(IDbConnection db)
            where T : BusinessObject<T>, IDBObject
        {
            if ((typeof(T) as IDBObject).Id > 0)
            {
                db.Update(this);
                return true;
            }
            else
            {
                db.Insert(this);
                return false;
            }
        }

Но получил эту ошибку:

System.NullReferenceException : Object reference not set to an instance of an object.

Спасибо за вашу помощь!

1 ответ

Решение
if ((typeof(T) as IDBObject).Id > 0)

следует изменить на:

if ((this as IDBObject).Id > 0)

Основная проблема с вашим исходным кодом заключается в том, что вы пытаетесь разыграть Type (от typeof) чтобы IDBObject, а не объект.

Другие вопросы по тегам