好的,我在第一个答案中完全读错了你的问题。这是一个更好的:)
过载是你最好的选择。由于比较的结果只取决于Name
,作出这样做是比较的方法,然后调用它:
private int Compare(string first, string second)
{
// do comparison
}
public int Compare(Type1 first, Type1 second)
{
return Compare(first.Name, second.Name):
}
public int Compare(Type2 first, Type2 second)
{
return Compare(first.Name, second.Name);
}
编辑:
既然你有一个以上的项目,有两件事情可以做:
public int Compare(string first1, string second1, X first2, X second2 ...
但是这会变得有点难看。另一种方法是提供一个投影提取值:
private int Compare<T>(T first, T second, Func<T,Tuple<string,int,TypeX,TypeY>> projection)
{
// test for first==null, second==null, etc...
var nicerFirst = projection(first);
var nicerSecond = projection(second);
// compare objects using nicerFirst.Item1, nicerFirst.Item2, etc.
}
那么你比较看起来类似:
int Compare(Type1 first, Type1 second)
{
return Compare(first, second, x => Tuple.Create(x.Name, x.Int, x.X, x.Y));
}
使这两种类型实现一个共同的界面看起来像去恕我直言的方式。 – 2010-09-09 20:57:01
两者都不可能。它们不是从相同的基类派生的,这两种类型不是由我写的,所以我不能改变它。 – KrisTrip 2010-09-09 20:57:55
即使类型不是由你写的,你仍然可以采取超载路线? – Bertvan 2010-09-09 20:59:30