Как сравнить значения экземпляров FieldInfo? - PullRequest
1 голос
/ 14 февраля 2012
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).

Ответы [ 3 ]

6 голосов
/ 14 февраля 2012

Вы используете ==, который будет сравнивать коробочные значения для любого поля, где тип является типом значения. Каждый раз, когда значение помещается в рамку, оно создает новый объект, поэтому == никогда не будет работать так. Используйте object.Equals вместо:

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

(Использование статического метода здесь означает, что он будет работать, даже если значения null.)

0 голосов
/ 14 февраля 2012

Поскольку field.GetValue (instance1) возвращает «значение» в виде «коробки» (объекта), следовательно, вызывая ==, вы сравниваете только две разные ссылки.

Попробуйте вместо этого позвонить:

field.GetValue(instance2).Equals(field.GetValue(instance1))
0 голосов
/ 14 февраля 2012

вы сравниваете address двух объектов, возвращаемых FieldInfo.GetValue, и, поскольку эти адреса в памяти различны, == никогда не бывает истинным.

попробуйте заменить if на это:

if (field.GetValue(instance2).Equals(field.GetValue(instance1)))
...