C# 如何混合/修复IComparable和IComparable<;T>;混乱
我有一个helper函数,它基本上在两个对象上调用CompareTo,但执行一些特殊的角大小写检查、转换等 最初我编写的函数是这样的:C# 如何混合/修复IComparable和IComparable<;T>;混乱,c#,generics,icomparable,C#,Generics,Icomparable,我有一个helper函数,它基本上在两个对象上调用CompareTo,但执行一些特殊的角大小写检查、转换等 最初我编写的函数是这样的: public static bool BetterCompare(IComparable lhs, IComparable rhs, out retCode) { ... retCode = lhs.CompareTo(rhs); ... } 但问题是,如果我有一个类,那么它就是一个AwesomeClass:IComparable。事实
public static bool BetterCompare(IComparable lhs, IComparable rhs, out retCode)
{
...
retCode = lhs.CompareTo(rhs);
...
}
但问题是,如果我有一个类,那么它就是一个AwesomeClass:IComparable
。事实上,我有几个旧的IComparable
类已经消失了IComparable
。然而,编译器很生气,因为它无法将这些新对象转换为IComparable
。我不知道这是否会让情况变得更糟,但其中一些是抽象的(尽管抽象类确实提供了一个实现)
我如何表达“我想要两个可以调用CompareTo的对象”,而不让编译器给我任何口吻。优选地,新函数不应该看起来像BetterCompare(这个,那个,out-retCode)代码>,但只是“做正确的事”。或者有没有更好的方法可以做到这一点,而不必触碰每一个类,使它们都i可比较
和i可比较
?您可以让AwesomeClass
实现非通用的i可比较
接口以及i可比较
,或者您可以编写一个通用的BetterCompare
方法:
public static bool BetterCompare<T>(T lhs, T rhs, out retCode)
where T : IComparable<T>
{
...
retCode = lhs.CompareTo(rhs);
...
}
public static bool BetterCompare(左、右、外代码)
其中T:i可比较
{
...
retCode=lhs.CompareTo(rhs);
...
}
(请注意,这可以与您现有的方法一起使用。)您可以始终将变量更改为对象类型,然后使用反射查看它们是否实现了其中一个接口,然后将它们转换为正确的接口
注意:反射速度非常慢,因此请谨慎使用。您可以查看一下,它同时实现了IComparer
和IComparer
,并在适当的位置使用它。不过,可能需要对代码进行一些重构。说明:
默认属性返回的对象使用System.Collections.Generic.IComparable
Generic接口比较两个对象。如果类型T未实现IComparable
通用接口,则默认属性返回使用System.Collections.IComparable
接口的比较器 您可以重载方法,但您需要更好的解决方案。谢谢。我试着用泛型来解决这个问题,但我不记得要限定(?)t。现在还没有-74951:)