2011-03-17 15 views
6

Obtengo value1 y value2 que son cero como iguales cuando deberían ser iguales.Comparando dos valores del método de reflexión GetValue

¿De qué otra manera puedo comparar los valores de estos 2 objetos?

private bool CheckProjectIsUnique(
    TBR.Domain.Project project, 
    List<UniqueProjectType> types, 
    out UniqueProjectType uniqueCandidate) 
{ 
    uniqueCandidate = CreateUniqueProjectType(project); 

    if (types.Count == 0) 
     return true; 

    foreach (UniqueProjectType type in types) 
    { 
     bool exists = true; 
     foreach (PropertyInfo prop in type.GetType().GetProperties()) 
     { 
      var value1 = prop.GetValue(type, null); 
      var value2 = prop.GetValue(uniqueCandidate, null); 
      if (value1 != value2) 
      { 
       exists = false; 
       break; 
      } 
     } 
     if (exists) 
      return true; 
    } 

    return false; 
} 

Respuesta

10

son objetos, lo que debe utilizar value1.Equals(value2) con la comprobación de si value1 no es null

EDIT: mejor: un uso estático Object.Equals(value1, value2) (créditos a @LukeH)

+3

O usar que 'Object.equals estáticos (valor1, valor2)' método que se encargará de la nula comprobación para usted. – LukeH

4

Igual se hereda de System.Object y no asegurará que ambos objetos se comparen correctamente si no proporciona su propia implementación de Equals.

Anular System.Object.Equals y/o implementar IEquatable<T> en los objetos de su dominio o cualquier objeto que desee evaluar su igualdad con otro.

Más información lectura de este artículo:

+0

El OP está utilizando el operador '' = 'no polimórfico en' object', por lo que no importa si sobrescribe 'Equals' o implementa' IEquatable ', el código del OP está probando para referencia (en) igualdad. – LukeH

+0

Pero está tratando de evaluar si value1 y value2 son iguales. Esto no se trata de referencias, ¿verdad? : D –

+0

O si me equivoco, entonces necesita formular una pregunta mejor, porque necesitaría especificar si quiere una igualdad de referencia o valor. –

2

Intercambiar if (value1 != value2) para if (!object.Equals(value1, value2)) y usted debe ser bueno para ir.

El operador != que está usando actualmente es no virtual, y dado que el tipo en tiempo de compilación de las llamadas es GetValueobject que siempre va a estar a prueba de referencia (des) igualdad.

El método estático object.Equals(x,y) prueba primero para la igualdad de referencia, y si los objetos no son la misma referencia, diferirá al método virtual Equals.

1

Si el tipo de la propiedad es un tipo de valor (como int por ejemplo), el valor devuelto por GetValue se incluirá en un objeto. Luego, == comparará las referencias de estos valores encuadrados. Si usted quiere tener una comparación correcta, se debe utilizar el método Equals:

class Program 
{ 
    class Test 
    { 
     public int A { get; set; } 
    } 

    static void Main(string[] args) 
    { 
     var testA = new Test { A = 1 }; 
     var testB = new Test { A = 1 }; 

     var propertyInfo = typeof(Test).GetProperties().Where(p => p.Name == "A").Single(); 

     var valueA = propertyInfo.GetValue(testA, null); 
     var valueB = propertyInfo.GetValue(testB, null); 

     var result = valueA == valueB; // False 
     var resultEquals = valueA.Equals(valueB); // True 

    } 
} 
+1

¡Eso funcionó para mí! Estoy usando el método Buscar de una lista Daniel