我有一个辅助函数,它基本上在两个对象上调用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);
,而只是“做正确的事情”。或者有没有更好的方法来做到这一点,而不是触及每个类 IComparable
和IComparable<T>
?
答案 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)
Default属性返回的对象使用System.Collections.Generic.IComparable<T>
通用接口来比较两个对象。如果类型T未实现IComparable<T>
通用接口,则Default属性返回使用Comparer<T>
接口的System.Collections.IComparable
。