0

我正在创建一个可以动态比较任何类型的两个对象的通用运算符方法。例如:

Object a = (int)5;
Object b = (long)7;
return a < b;

现在这显然不会编译,因为 object 不提供小于运算符。将对象转换回它们各自的类型显然会起作用。

但是我不知道运行时的类型。

如果我可以使用 .NET 4(我不能),那么我可以将对象转换为动态的,一切都会好起来的。但是,由于我不能,我相信我只剩下使用表达式的代码生成,或者为每种可能的类型和值提供强制转换!

所以表情!

如果我要创建一个表达式,我需要将对象拆箱为正确的类型(简单),但随后我需要将任何数值类型提升为任一操作数中的最大值。升级规则记录在 C# 规范中。

我的问题是,框架中是否有任何预先编写的促销代码,或者,我是否以错误的方式处理这个问题!

谢谢您的帮助。

更新

感谢您的回答。我必须承认我并没有考虑使用 IComparable,因为该方法将用于数字之外(尽管我没有明确提及)。话虽如此,我可能会检查两个对象是否都实现了接口并在它们实现时使用它。

4

2 回答 2

3

使用泛型,如果你使用 where T : IComparable,你可以对对象(值)使用比较方法

static bool IsLessThan<T>(T a, T b) where T : IComparable
{
  return a.CompareTo(b) < 0;
}

对于两种不同的类型:

static bool IsLessThan<T, V>(T a, V b) where T : IComparable where V : IComparable
{
  return a.CompareTo(b) < 0;
}

注意值类型 int、long 等——已经是 IComparable,这有多酷?:)

于 2012-04-19T19:08:48.810 回答
0

最好的方法可能是使用泛型(如果你还没有)并将泛型类型限制为那些实现的类型IComparable,然后使用它的CompareTo方法。

于 2012-04-19T19:10:05.767 回答