开发者

Comparing 2 NHibernate loaded object problem

开发者 https://www.devze.com 2022-12-10 04:01 出处:网络
I have a class Client like that: public class Client { public Person Pers { ge开发者_如何学编程t; set; }

I have a class Client like that:

public class Client
{
    public Person Pers { ge开发者_如何学编程t; set; }
}

And I have 2 Person´s child class :

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

So, my Client could be PersonType1 or PersonType2...

I load 2 Client using NHibernate... And after that, I´m trying to compare than (the difference are on PersonType1 and PersonType2 attributes)...

I tried that:

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

The problem is that __c1.Person.GetType() returs PersonProxy127b2a2f44f446089b336892a673643b instead of the correct type... It´s because of NHibernate...

How can I do that ? Ideas?

Thanks


Rather than having two different attributes on PersonType1 and PersonType2, define a single property in the base class Person and override it in each of the child classes. Using polymorphic behavior rather than explicit type-checking is better in any case, and essential when you're using NHibernate's proxied classes. Something like this might accomplish what you want:

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


Use the is operator instead of 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.");
        }
    }
}
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号