我有一个助手函数,它基本上在两个对象上调用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>。
发布于 2009-07-02 16:18:40
您可以让AwesomeClass实现非通用IComparable接口以及IComparable<T>,也可以编写一个通用的BetterCompare方法:
public static bool BetterCompare<T>(T lhs, T rhs, out retCode)
where T : IComparable<T>
{
...
retCode = lhs.CompareTo(rhs);
...
}(请注意,它可以与您现有的方法一起使用。)
发布于 2009-07-02 16:23:33
您可以始终将变量更改为对象类型,然后使用反射来查看它们是否实现了其中一个接口,然后将它们转换为正确的接口。
注意:反射太慢了,所以要小心使用。
发布于 2009-07-02 16:24:25
您可以查看Comparer,它实现了IComparer<T>和IComparer,并在适当的位置使用它。不过,它可能需要对代码进行一些重构。
https://stackoverflow.com/questions/1075295
复制相似问题