我在这里试图实现的是对装箱基本类型进行直接值比较。
((object)12).Equals((object)12); // Type match will result in a value comparison,
((object)12).Equals((object)12d); // but a type mismatch will not. (false)
object.Equals((object)12,(object)12d); // Same here. (false)
我理解了“为什么”,但我不知道“如何”实现。这些类型在运行时是未知的,可以是数据源中的任何原始类型,包括字符串、日期时间、布尔值等等。 我已经采取了一个丑陋的方法,编写了一个扩展方法,在进行“==”比较之前计算出两个类型并进行转换:(为了完整起见,我包括了每种原始类型以及我感兴趣的类型)
public static bool ValueEquals(this object thisObj, object compare)
{
if (thisObj is int)
{
int obj = (int)thisObj;
if (compare is int)
return (obj == (int)compare);
if (compare is uint)
return (obj == (uint)compare);
if (compare is decimal)
return (obj == (decimal)compare);
if (compare is float)
return (obj == (float)compare);
<... and so on for each primitive type ...>
}
if (thisObj is uint)
{
uint obj = (uint)thisObj;
if (compare is int)
return (obj == (int)compare);
if (compare is uint)
return (obj == (uint)compare);
<... Again for each primitive type ...>
}
if (thisObj is decimal)
{
decimal obj = (decimal)thisObj;
if (compare is int)
return (obj == (int)compare);
<... Etc, etc ...>
最终的方法达到了300多行,虽然有点丑陋但还可以接受。但现在我需要比较不仅仅是“==”,我还需要">"、"<"、"<="、">="和"!="。
在反射中有没有什么可以用于装箱值类型比较的东西?
有任何东西吗?
==
操作符会抛出运行时异常。 - johnDisplayClassConvert.ChangeType
在两个参数上返回一个字符串,然后简单地使用==
。对于>、<、>=、<=等,我返回一个十进制数并使用适当的运算符。太棒了! - johnDisplayClass