[英]How to mix/fix IComparable and IComparable<T> mess
我有一个辅助函数,该函数基本上在两个对象上调用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>
每个类?
您可以使AwesomeClass
实现非AwesomeClass
的IComparable
接口以及IComparable<T>
,也可以编写通用的BetterCompare
方法:
public static bool BetterCompare<T>(T lhs, T rhs, out retCode)
where T : IComparable<T>
{
...
retCode = lhs.CompareTo(rhs);
...
}
(请注意,这可以与现有方法一起使用。)
您总是可以将变量更改为对象类型,然后使用反射来查看它们是否实现了接口之一,然后将其强制转换为正确的接口。
注意:反射太慢了,请谨慎使用。
您可以看一下同时实现IComparer<T>
和IComparer
Comparer<T>
,并在适当的地方使用它。 不过,这可能需要对代码进行一些重构。
该文件说:
Default属性返回的对象使用System.Collections.Generic.IComparable<T>
通用接口比较两个对象。 如果类型T没有实现IComparable<T>
通用接口,则Default属性将返回一个使用System.Collections.IComparable
接口的Comparer<T>
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.