如何从C#中的父对象访问子对象字段?

时间:2017-12-10 12:48:34

标签: c# abstract-class dapper dapper-contrib

我使用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 个答案:

答案 0 :(得分:3)

if ((typeof(T) as IDBObject).Id > 0)

应更改为:

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

原始代码的主要问题是您尝试将Type(从typeof)投射到IDBObject,而不是对象。