如何比较从Reflection' &; getvalue &;获得的值类型?

本文关键字:getvalue 类型 何比较 比较 Reflection | 更新日期: 2023-09-27 17:49:22

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

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
}

如何比较从Reflection' &; getvalue &;获得的值类型?

不需要调用ConvertGetValue返回的值已经是int s。简单地对它们进行强制转换就会得到正确的结果。

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
}

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

另一种获得正确值的方法是调用Equals方法,该方法将被正确路由到Int32.Equals,并打印true:
Console.WriteLine(test1Converted.Equals(test2Converted)); // prints true

注意,在这种情况下,Convert.ChangeType仍然是不必要的。

Convert.ChangeType()返回对象。将返回对象强制转换为Int32:

    var test1Converted = (Int32)Convert.ChangeType(test1Value, test1Value.GetType());
    var test2Converted = (Int32)Convert.ChangeType(test2Value, test2Value.GetType());

编辑评论:测试类型是否为IComparable,然后使用该接口进行比较:

    if (test1Converted is IComparable && test2Converted is IComparable)
    {
      var test1IComparable = (IComparable)test1Converted;
      var test2IComparable = (IComparable)test2Converted;
      bool equal = (test1IComparable == test2IComparable);
    }