从接口查找已实现的类



我有两个实现接口的类。接口作为参数传递给一个方法,然后在下面的NHibernate语法中作为T类使用

Session.Query<T>() 

然而,由于接口是由两个类实现的,因此由Session运行的SQL。查询是2个Select语句(Select ..)从男孩。和选择…从女孩)。

我需要知道的是如何将icchild参数"转换"为一个类,然后使用该类填充Session.Query()调用。

代码如下。正如你所看到的,我有一个变通的办法,但它不是很漂亮,并且有多个icchild类将成为大量重复的代码。

谢谢!

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

使用泛型:

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

泛型方法需要传递给它的实际编译时类类型,而不是一些运行时类型,所以除非有这个方法的非泛型版本接受运行时类型指示,否则我猜您使用这种方法是不走运的。然而,你可以将创建移动到子类本身,并将会话传递给它,这将把这个单体函数分开,并将其分发给具有编译时类类型知识的子类,这些子类将传递给泛型方法。

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

相关内容

  • 没有找到相关文章

最新更新