比较2个NHibernate加载的对象问题

时间:2009-11-05 18:13:35

标签: c# nhibernate

我有一个类客户端:

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

我有2个人的孩子班:

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

因此,我的客户端可能是PersonType1或PersonType2 ......

我使用NHibernate加载2个客户端...之后,我试图比较(不同之处在于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()重新调整PersonProxy127b2a2f44f446089b336892a673643b而不是正确的类型...这是因为NHibernate ......

我该怎么做?想法?

由于

2 个答案:

答案 0 :(得分:1)

不是在PersonType1和PersonType2上有两个不同的属性,而是在基类Person中定义一个属性,并在每个子类中覆盖它。在任何情况下,使用多态行为而不是显式类型检查更好,并且在使用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 :(得分: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.");
        }
    }
}