繁体   English   中英

如何混合/修复IComparable和IComparable <T> 烂摊子

[英]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); ,只是“做正确的事”。 还是有一种更好的方法可以做到这一点,而无需触碰使它们成为IComparableIComparable<T>每个类?

您可以使AwesomeClass实现非AwesomeClassIComparable接口以及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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM