将值类型强制转换为对象进行比较

3
我有一个方法返回一个对象,该对象可以是多种数据类型之一,包括字符串、数字和布尔值;在某些时候,我需要比较这个方法返回的两个值是否相等。我使用==而不是Equals()因为我需要比较不同种类的数字-即3 == 3.0 -对于字符串和数字来说这很好用,但是对于某些原因当我比较布尔值时它失败了。

最好的解决方法是什么?如果没有其他解决方案,我希望不必检测类型并强制转换为bool。

我的代码大致如下:

private object GetValue() {
    // does some stuff, returns either a boolean, string or number value
}

var value1 = GetValue();
var value2 = GetValue();
if (value1 == value2) {
    // do something
}

1
== 对你来说行不通。句号。(object)"a" ==new String(new[]{'a'}) 是假的。 - SLaks
2
(object)1 == (object)1.0在.NET 4.0中是false。 - Dmitrii Dovgopolyi
1
你尝试过创建3个不同的函数(重载),每个函数返回正确的类型,而不是使用Object吗?或者创建一些基本的泛型类来接受T? - Greg Oks
2
这通常是一个微不足道的问题,但有一个例外,即您假设不同类型有时需要被视为相等。如果您可以将所有数字类型转换为单一类型(即将所有整数类型转换为“double”),那么问题就很简单了,只需使用“object.Equals”。 - Servy
1
@JordanWallwork 你有哪些数字类型?只有int和double吗?还是包括其他可能的数字类型? - Servy
显示剩余9条评论
2个回答

4
public bool Compare(object value1, object value2)
{
    if (value1.GetType() == value2.GetType())
    {
        return value1.Equals(value2);
    }
    else
    {
        //your logic for handling different numbers
    }
}

它仍然感觉有点刻意,但我最终使用了这个,并在类型不匹配时进行ToString。我并不完全满意,但至少现在所有的测试都通过了 :) - Jordan Wallwork

0

你可以将函数返回字符串,然后将结果解析为布尔值、整数或其他你想要的类型,再进行比较,如何?

编辑:

private string GetValue() {}

string val = getValue();
string val2 = getValue();

bool a1;
bool b1;
int a2;
int b2;
double;
double;

bool r1 = bool.TryParse(val, out a1);
bool r2 = bool.TryParse(val2, out b1);
bool r3 = int.TryParse(val, out a2);
bool r4 = int.TryParse(val2, out b2);
bool r5 = double.TryParse(val, out a3);
bool r6 = double.TryParse(val2, out b3);

if ((a1 == b1 && r1 && r2)) || (a2 == b2 && r3 && r4)) || (a3 == b3 && r5 && r6))
return true;

1
由于在“TryParse”函数中,所有变量都将被覆盖,因此您不需要分配变量。 - default
@默认情况下,您是正确的,但我不希望出现tryParse失败两个值的情况,结果将为0 = 0,这将返回true... 但我编辑了我的答案,现在也许看起来更好了。 - Greg Oks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接