2 votes

Comment comparer les valeurs des instances de FieldInfo ?

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;
}

Ne renvoie jamais "Oui".

EDIT : Sans en sachant à l'avance quels seront les types. Je ne peux donc pas avoir : (bool)field.GetValue(instance1) .

8voto

Jon Skeet Points 692016

Vous utilisez == qui comparera les valeurs encadrées pour tous les champs dont le type est un type de valeur. Chaque fois qu'une valeur est encadrée, un nouvel objet est créé. == ne fonctionnera jamais ainsi. Utiliser object.Equals au lieu de cela :

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

(L'utilisation de la méthode statique ici signifie que cela fonctionnera même si les valeurs sont null .)

0voto

Davide Piras Points 28708

Vous comparez les address des deux objets renvoyés par FieldInfo.GetValue et comme ces adresses en mémoire sont différentes, la == n'est jamais vrai.

essayez de remplacer le if avec ceci :

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

0voto

Maghis Points 707

Parce que field.GetValue(instance1) renvoie une version "encadrée" (objet) de la valeur, d'où l'appel à == vous ne faites que comparer deux références différentes.

Essayez plutôt d'appeler :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X