我有一个静态方法接受两个对象类型变量并运行CompareTo()方法:
public static int Compare(Object objA, Object objB)
{
return (((IComparable)objA).CompareTo(objB));
}
问题是CompareTo()在尝试比较不同类型(例如int和double)时会抛出异常。 有没有人知道C#中更好的方法,比较两种不同的类型? 或者解决这个问题?
由于
答案 0 :(得分:2)
在C#中没有通用的方法来解决这个问题,因为它没有通用的解决方案。如果没有丢失信息,C#编译器将隐式地将一种类型转换为另一种类型然后进行比较。在任何其他情况下,这将抛出异常。
在这个例子中,实现IComplarable接口的程序员负责决定两个对象是否具有可比性,并且作为一个类的用户对此没有影响。
答案 1 :(得分:1)
可能的解决方法是使用IComparable<T>
界面,通过反射:
public static int Compare(Object objA, Object objB)
{
Type comparableType = typeof(IComparable<>).MakeGenericType(objA.GetType());
MethodInfo compareMethod = comparableType.GetMethod("CompareTo");
return (int)compareMethod.Invoke(objA, new[] { objB });
}
然而,它会更慢,只有在objB的类型可以转换为objA的类型时才会起作用。
答案 2 :(得分:1)
如果仅处理数值,您可以使用此方法为Nenad描述的问题提供解决方法:
public static int Compare(Object objA, Object objB)
{
object objB_as_AType = System.Convert.ChangeType(objB, objA.GetType());
return (((IComparable)objA).CompareTo(objB_as_AType));
}
但要非常小心,因为你假设A是没有任何检查的IC Comparable,你必须保证所涉及的类型确实相互转换。
答案 3 :(得分:0)
如果您只是比较数字,这适用于大多数情况:
public static int Compare(Object objA, Object objB)
{
return (((IComparable)Convert.ToDouble(objA)).CompareTo(Convert.ToDouble(objB)));
}
答案 4 :(得分:0)
你必须建立自己的逻辑才能做到这一点,主要是因为只有你知道底层比较应该做什么。
举个例子,比较
int i = 10;
double d = 10.2;
这些是平等的吗?是否应将整数提升为双数,然后进行比较?然后不,不相等 double应该被截断为整数吗?然后是的,他们是平等的。
在静态方法中,您需要检查A&amp; A的类型。 B是相同的,如果是这样,那么你可以调用a.compareTo(b)。
如果没有,那么您需要决定如何比较不同的类型,并在静态方法中实现该解决方案。
希望这有帮助