2011-10-14 54 views
0

我有2個類實現接口。 接口被傳遞到一個方法作爲參數,並隨後在下面的NHibernate語法用作T艙從接口中查找實現的類

Session.Query<T>() 

然而,由於界面由2類,即得到由會話運行SQL實現。查詢是2個選擇語句(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;    
    } 

回答

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

謝謝Piotr - 完美。 –

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

謝謝。我應該重新命名Create方法,因爲它實際上並不關心創建任何東西,而是進行一些處理。所以我不能真正將這種方法轉移給孩子 –