我有一个类客户端:
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 ......
我该怎么做?想法?
由于
答案 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.");
}
}
}