我有一个静态方法,它接受两个对象类型变量并运行 CompareTo() 方法:
public static int Compare(Object objA, Object objB)
{
return (((IComparable)objA).CompareTo(objB));
}
问题是CompareTo() 在尝试比较不同类型(例如int 和double)时抛出异常。有谁知道在 C# 中比较两种不同类型的更好方法?或者解决这个问题的方法?
谢谢
在 C# 中没有解决该问题的通用方法,因为没有通用的解决方案。如果没有丢失信息,C# 编译器会将一种类型隐式转换为另一种类型,然后进行比较。在任何其他情况下,这将引发异常。
在此示例中,实现IComplarable接口的程序员负责决定两个对象是否可比较,而您作为类的用户对此没有影响。
一种可能的解决方法是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 的类型时才会起作用。
如果仅处理数值,您可以使用以下方法针对 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 是 IComparable 没有任何检查,并且您必须保证所涉及的类型确实相互转换。
你必须建立自己的逻辑来做到这一点,主要是因为只有你知道底层比较应该做什么。
例如,以您为例,比较
int i = 10;
double d = 10.2;
这些是平等的吗?是否应该将整数提升为双精度,然后进行比较?那么不,不相等。
是否应该将双精度截断为整数?那么是的,他们是平等的。
在你的静态方法中,你需要检查A&B的类型是否相同,如果是,那么你可以调用a.compareTo(b)。
如果不是,那么您需要决定如何比较不同类型,并在静态方法中实现该解决方案。
希望这可以帮助
如果您只是比较数字,这将适用于大多数情况:
public static int Compare(Object objA, Object objB)
{
return (((IComparable)Convert.ToDouble(objA)).CompareTo(Convert.ToDouble(objB)));
}