如何比较从Reflection的"GetValue"中获取的值类型?

5 c# reflection equality

我有这个代码从Test类获取值,然后将其转换为它的类型.它以"Int32"正确打印,但是当我用另一个具有相同值的变量测试相等时,它会打印"false".我怀疑这是因为它正在测试引用相等,并且2个变量实际上仍然是对象.有没有办法比较它们,记住我不会知道在运行时返回的值的类型(它可能是一个字符串,浮点数,其他类等)?

class Test{public int y;}

static void Main()
{
    var test1 = new Test{y=1};
    var test2 = new Test{y=1};
    var fields = test1.GetType().GetFields();
    var test1Value = fields[0].GetValue(test1);
    var test2Value = fields[0].GetValue(test2);
    var test1Converted = Convert.ChangeType(test1Value, test1Value.GetType());
    var test2Converted = Convert.ChangeType(test2Value, test2Value.GetType());
    Console.WriteLine(test1Converted); // prints Int32
    Console.WriteLine(test1Converted == test2Converted); // prints false
}
Run Code Online (Sandbox Code Playgroud)

Jas*_*ins 2

拨打电话Convert是不必要的。返回的值GetValue已经是ints。只需投射它们即可得到正确的结果。

private class Test
{
    public int y;
}

private static void Main()
{
    Test test1 = new Test { y = 1 };
    Test test2 = new Test { y = 1 };
    FieldInfo[] fields = test1.GetType().GetFields();
    int test1Value = (int)fields[0].GetValue(test1);
    int test2Value = (int)fields[0].GetValue(test2);
    Console.WriteLine(test1Value); // prints Int32
    Console.WriteLine(test1Value == test2Value); // prints true
}
Run Code Online (Sandbox Code Playgroud)

未转换的值失败的原因是它Convert.ChangeType仍然返回一个object,它将整数装箱,因此您确实获得了引用相等性。

获取正确值的另一种方法是调用该Equals方法,该方法将被正确路由到Int32.Equals, 并打印true

Console.WriteLine(test1Converted.Equals(test2Converted)); // prints true
Run Code Online (Sandbox Code Playgroud)

请注意,在这种情况下,Convert.ChangeType仍然没有必要。