2
public partial class Form1 : Form
{        
    public Form1()
    {
        InitializeComponent();

        myClass instance1 = new myClass();
        myClass instance2 = new myClass();
        FieldInfo[] fields = typeof(myClass).GetFields();
        foreach (FieldInfo field in fields) if (field.GetValue(instance2) == field.GetValue(instance1)) Text = "Yes";           
    }
}

class myClass
{
    public bool b = false;
    public int i = 2;
}

从不返回“是”。

编辑:事先知道类型是什么。所以我不能:(bool)field.GetValue(instance1)

4

3 回答 3

8

您正在使用==,它将比较类型为值类型的任何字段的装箱值。每次装箱一个值时,它都会创建一个新对象,因此==永远不会那样工作。改用object.Equals

 foreach (FieldInfo field in fields)
 {
     if (object.Equals(field.GetValue(instance2), field.GetValue(instance1))
     {
         Text = "Yes";
     }
 }

(在这里使用静态方法意味着即使值是 ,它也会起作用null。)

于 2012-02-13T23:27:06.227 回答
0

您正在比较addressFieldInfo.GetValue 返回的两个对象中的 ,并且由于内存中的这些地址不同,因此==永远不会正确。

尝试用if这个替换:

if (field.GetValue(instance2).Equals(field.GetValue(instance1)))
于 2012-02-13T23:31:29.417 回答
0

因为field.GetValue(instance1)返回值的“盒装”(对象)版本,因此调用==您只是比较两个不同的引用。

尝试改为调用:

field.GetValue(instance2).Equals(field.GetValue(instance1))
于 2012-02-13T23:33:00.610 回答