Как получить доступ к полям дочерних объектов из родительского объекта в 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
, а не объект.