好的,我在第一個答案中完全讀錯了你的問題。這是一個更好的:)
過載是你最好的選擇。由於比較的結果只取決於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