2009-11-05 6 views
1

J'ai un client de classe comme ça:comparaison 2 problème NHibernate objet chargé

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

Et je 2 Person's classe enfant:

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

Ainsi, mon client pourrait être PersonType1 ou PersonType2

Je charge 2 Client en utilisant NHibernate ... Et après cela, j'essaie de comparer que (la différence est sur les attributs PersonType1 et PersonType2) ...

J'ai essayé:

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

Le problème est que __c1.Person.GetType() returs PersonProxy127b2a2f44f446089b336892a673643b au lieu du type correct ... Il est à cause de NHibernate ...

Comment Je fais ça ? Des idées?

Merci

+0

Il est à cause de NHibernate et Lazy Loading. Malheureusement, je n'ai pas de solution pour votre Comparer à court de comparer les propriétés. – mxmissile

Répondre

1

Plutôt que d'avoir deux attributs différents sur PersonType1 et PersonType2, définissent une propriété unique dans la personne de classe de base et le remplacer dans chacune des classes d'enfants. Utiliser un comportement polymorphe plutôt qu'un contrôle de type explicite est préférable dans tous les cas, et essentiel lorsque vous utilisez les classes proxy de NHibernate. Quelque chose comme cela pourrait accomplir ce que vous voulez:

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

Utilisez l'opérateur is au lieu de 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."); 
     } 
    } 
} 
Questions connexes