从接口中查找已实现的类

时间:2011-10-14 09:45:40

标签: c# nhibernate generics reflection interface

我有2个类来实现接口。 接口作为参数传递给方法,随后在以下NHibernate语法

中用作T类
Session.Query<T>() 

但是,由于接口是由2个类实现的,因此Session.Query运行的SQL是2个Select语句(从Boy中选择..并从Girl中选择..)。

我需要知道的是如何将IChild参数“转换”为Class,然后使用该类填充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 个答案:

答案 0 :(得分:1)

使用泛型:

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

答案 1 :(得分:0)

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

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