如何比较从 Reflection 的 "GetValue" 中获取的值类型?
How can I compare value-types acquired from Reflection's "GetValue"?
我有这段代码,它从测试 class 中获取值,然后将其转换为它的类型。它正确打印为 "Int32",但是当我用另一个具有相同值的变量测试相等性时,它打印 "false"。我怀疑这是因为它正在测试引用相等性并且这 2 个变量实际上仍然是对象。
有什么方法可以比较它们,请记住,直到运行时我才知道返回值的类型(它可能是字符串、浮点数、其他 class 等)?
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
}
不需要调用 Convert
。 GetValue
返回的值已经是 int
了。简单地转换它们会给出正确的结果。
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
仍然是 returns 一个 object
,boxes 是整数,所以你确实得到了引用相等.
获取正确值的另一种方法是调用 Equals
方法,该方法将被正确路由到 Int32.Equals
,并打印 true
:
Console.WriteLine(test1Converted.Equals(test2Converted)); // prints true
请注意,在这种情况下,Convert.ChangeType
仍然不是必需的。
Convert.ChangeType() return 对象。将 returned 对象转换为 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);
}
我有这段代码,它从测试 class 中获取值,然后将其转换为它的类型。它正确打印为 "Int32",但是当我用另一个具有相同值的变量测试相等性时,它打印 "false"。我怀疑这是因为它正在测试引用相等性并且这 2 个变量实际上仍然是对象。 有什么方法可以比较它们,请记住,直到运行时我才知道返回值的类型(它可能是字符串、浮点数、其他 class 等)?
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
}
不需要调用 Convert
。 GetValue
返回的值已经是 int
了。简单地转换它们会给出正确的结果。
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
仍然是 returns 一个 object
,boxes 是整数,所以你确实得到了引用相等.
获取正确值的另一种方法是调用 Equals
方法,该方法将被正确路由到 Int32.Equals
,并打印 true
:
Console.WriteLine(test1Converted.Equals(test2Converted)); // prints true
请注意,在这种情况下,Convert.ChangeType
仍然不是必需的。
Convert.ChangeType() return 对象。将 returned 对象转换为 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);
}