如何混合/修复IComparable和IComparable <t> mess </t>

时间:2009-07-02 16:14:50

标签: c# generics icomparable

我有一个辅助函数,它基本上在两个对象上调用CompareTo,但会进行一些特殊的角点检查,转换等。

最初我写了这样的函数:

public static bool BetterCompare(IComparable lhs, IComparable rhs, out retCode)
{
    ...
    retCode = lhs.CompareTo(rhs);
    ...
}

但问题是如果我有一个class AwesomeClass : IComparable<AwesomeClass>。事实上,由于一些较早的IComparable课程已经过IComparable<T>,我有几个。然而编译器生气,因为它无法将这些新对象转换为IComparable。我不知道这是否会使情况变得更糟,但其中一些是abstract(虽然抽象类确实提供了实现)。

我怎样才能传达“我想要两个我可以称之为CompareTo的对象”而不是编译器给我任何一个嘴唇。优选地,新函数不应该看起来像BetterCompare<AwesomeClass>(this, that, out retCode);,而只是“做正确的事情”。或者有没有更好的方法来做到这一点,而不是触及每个类 IComparableIComparable<T>

4 个答案:

答案 0 :(得分:9)

您可以AwesomeClass实现非通用IComparable界面以及IComparable<T>,也可以编写通用BetterCompare方法:

public static bool BetterCompare<T>(T lhs, T rhs, out retCode)
    where T : IComparable<T>
{
    ...
    retCode = lhs.CompareTo(rhs);
    ...
}

(请注意,这可以与您现有的方法一起使用。)

答案 1 :(得分:0)

您总是可以将变量更改为对象类型,然后使用反射来查看它们是否实现了其中一个接口,然后将它们转换为正确的接口。

注意:反射速度很慢,所以请谨慎使用。

答案 2 :(得分:0)

您可以查看Comparer<T>,它同时实现IComparer<T>IComparer,并在适当的位置使用它。可能需要对代码进行一些重构。

答案 3 :(得分:0)

documentation说:

Default属性返回的对象使用System.Collections.Generic.IComparable<T>通用接口来比较两个对象。如果类型T未实现IComparable<T>通用接口,则Default属性返回使用Comparer<T>接口的System.Collections.IComparable