2009-11-05 27 views
1

我有一類客戶端這樣的:比較2的NHibernate加載的對象問題

public class Client 
{ 
    public Person Pers { get; set; } 
} 

而且我有2個聯絡人的子類:

public class PersonType1 : Person {...} 
public class PersonType2 : Person {...} 

所以,我的客戶可以PersonType1或PersonType2 ...

我加載2客戶端使用NHibernate ...然後,我試圖比較(差異在PersonType1和PersonType2屬性)...

我試過:

public class ClientComparer : IComparer<Client> 
{ 
    public int Compare(Client __c1, Client __c2) 
    { 
     string _name1 = __c1.Person.GetType().Equals(typeof(PersonType2)) ? ((PersonType2)(__c1.Person)).Type2Att : ((PersonType1)(__c1.Person)).Type1Att ; 

     string _name2 = __c2.Person.GetType().Equals(typeof(PersonType2)) ? ((PersonType2)(__c2.Person)).Type2Att : ((PersonType1)(__c2.Person)).Type1Att; 


     if (_name1 == null) 
     { 
      if (_name2 == null) 
      { 
       return 0; 
      } 
      return -1; 
     } 
     if (_name2 == null) 
     { 
      return 1; 
     } 
     return _name1.CompareTo(_name2); 
    } 
} 

的問題是,__c1.Person.GetType()returs而不是正確的類型......因爲NHibernate的的It's PersonProxy127b2a2f44f446089b336892a673643b ...

哪有我這樣做?想法?

由於

+0

這是因爲NHibernate和延遲加載。可悲的是,我沒有比較屬性的比較器解決方案。 – mxmissile 2009-11-05 18:24:50

回答

1

而不是具有上PersonType1和PersonType2兩種不同的屬性,定義基類人的一個屬性並且在每個子類的覆蓋它。在任何情況下,使用多態行爲而不是顯式類型檢查都是更好的選擇,並且在使用NHibernate的代理類時非常重要。像這樣的東西可能會完成你想要的:

public class Person 
{ 
    public string Name {get;} 
} 


public class PersonType2 : Person 
{ 
     private string something; 
     public override string Name 
     { 
      get 
      { 
      return something; 
      } 
      set 
      { 
      something = value; 
      } 
     } 
} 

public class PersonType2 : Person 
{ 
     private string somethingElse; 
     public override string Name 
     { 
      get 
      { 
      return somethingElse; 
      } 
      set 
      { 
      somethingElse = value; 
      } 
     } 
} 

public class Client 
{ 
    public int Compare(Client __c1, Client __c2) 
    { 
     return __c1.Pers.Name.CompareTo(__c2.Pers.Name); 
    } 
} 
1

使用is操盤的GetType():

public class ClientComparer : IComparer<Client> 
{ 
    public int Compare(Client __c1, Client __c2) 
    { 
     string _name1 = GetName(__c1.Person);  
     string _name2 = GetName(__c2.Person);  

     if (_name1 == null) 
     { 
      if (_name2 == null) 
      { 
       return 0; 
      } 
      return -1; 
     } 
     if (_name2 == null) 
     { 
      return 1; 
     } 
     return _name1.CompareTo(_name2); 
    } 

    private string GetName(Person person) 
    { 
     if (person is Person1) 
     { 
      return ((Person1)person).Type1Att; 
     } 
     else if (person is Person2) 
     { 
      return ((Person2)person).Type2Att; 
     } 
     else 
     { 
      throw new ArgumentException("Unhandled Person type."); 
     } 
    } 
}