Нахождение реализованного класса из интерфейса - PullRequest
0 голосов
/ 14 октября 2011

У меня есть 2 класса, которые влияют на интерфейс.Интерфейс передается в метод в качестве параметра, а затем используется как класс T в следующем синтаксисе NHibernate

Session.Query<T>() 

Однако, поскольку интерфейс реализован двумя классами, SQL-запрос, запускаемый Session.Query - это 2 оператора Select (Select .. from Boy. И Select .. from Girl).

Мне нужно знать, как «преобразовать» параметр IChild в класс, а затем использовать этот класс.для заполнения вызова Session.Query ().

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

Спасибо!

public interface IChild
{
    DateTime Date { get; }
    Parent Parent { get; set; }
}

public class Boy : IChild
{
    public virtual Parent Parent { get; set; }
    public virtual DateTime GraduationDate { get; set; }
    public virtual DateTime Date { get { return GraduationDate; } set { } }
}

public class Girl : IChild
{
    public virtual Parent Parent { get; set; }
    public virtual DateTime WeddingDate { get; set; }
    public virtual DateTime Date { get { return WeddingDate; } set { } }
}

    public bool Create(IChild entity)
    {            
        //Is there an existing child record for the key details
        IChild child = null;
        if(entity is Boy)
        {
            child = Session.Query<Boy>()
                .Where(x => x.Date == entity.Date)
                .SingleOrDefault();
        }
        else if (entity is Girl)
        {
            child = Session.Query<Girl>()
                .Where(x => x.Date == entity.Date)
                .SingleOrDefault();
        }

    return child.Parent != null;            
    }

Ответы [ 2 ]

1 голос
/ 14 октября 2011

Используйте дженерики:

public bool Create<T>(T entity)
where t : class, IChild
{            
    //Is there an existing child record for the key details
    IChild child = null;
        child = Session.Query<T>()
            .Where(x => x.Date == entity.Date)
            .SingleOrDefault();

return child.Parent != null;            
}
0 голосов
/ 14 октября 2011

универсальный метод ожидает, что ему передан фактический тип класса времени компиляции, а не какой-либо тип времени выполнения, поэтому, если не существует неуниверсальной версии этого метода, которая принимает указание типа времени выполнения, я полагаю, что вам не повезло с использованием этого подхода,однако вы можете вместо этого переместить создание в сам дочерний элемент и передать ему сеанс, который разорвёт эту монолитную функцию и распределит ее по дочерним элементам, которые будут знать тип класса compiletime для передачи в универсальный метод.

public interface IChild 
{ 
DateTime Date { get; } 
Parent Parent { get; set; } 
IChild Create(Session session);
} 

public class Boy : IChild 
{
public virtual Parent Parent { get; set; } 
public virtual DateTime GraduationDate { get; set; } 
public virtual DateTime Date { get { return GraduationDate; } set { } } 
public virtual IChild Create(Session session) { return session.Query<Boy>().Where(x => x.Date == entity.Date).SingleOrDefault(); }
} 

public class Girl : IChild 
{ 
public virtual Parent Parent { get; set; } 
public virtual DateTime WeddingDate { get; set; } 
public virtual DateTime Date { get { return WeddingDate; } set { } } 
public virtual IChild Create(Session session) { return session.Query<Girl>().Where(x => x.Date == entity.Date).SingleOrDefault(); }
} 

public bool Create(IChild entity) 
{             
    //Is there an existing child record for the key details 
    return entity.Create(Session).Parent != null;
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...