¿Cómo accedo a los campos de objetos secundarios desde un objeto principal en C #?

abstract-class c# dapper dapper-contrib

Pregunta

Estoy usando Dapper.net como un ORM. Tengo una clase abstracta llamada BusinessObject, heredada de otras clases que representan las tablas en mi base de datos, por ejemplo SubContractorJob.

Tengo un método en la clase BusinessObject llamado "Persist", que guarda un registro en la base de datos:

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;
        }
    }

}

Actualmente, como puede ver, el método Persist toma un objeto como entrada.

Lo que significa que cuando heredo de la clase BusinessObject, tengo que llamarlo así desde mi objeto hijo:

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);

Mi pregunta es: ¿cómo puedo hacer que esto funcione sin tener que pasar 's' cuando ya estoy llamando al método en el contexto de s (el objeto hijo)?

Tengo una interfaz (IDBObject) configurada, por lo que siempre se garantiza que el objeto hijo tenga el campo Id presente.

Intenté esto:

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;
            }
        }

Pero obtuve este error:

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

¡Gracias por tu ayuda!

Respuesta aceptada

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

debe cambiarse a:

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

El principal problema con su código original es que está tratando de convertir un Type (de typeof ) en IDBObject , en lugar de un objeto.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué