2014-04-28 4 views
1

Entity Framework 엔티티와 비교할 수있는 코드가 있습니다.POCO 비교자가 작동하지 않습니다.

그러나 논리적 관점에서 볼 때 실제로 false (일치하지 않음)를 반환하는 것으로 나타났습니다.

HashSet 때문에 실패합니다. 비교할 때 항상 false를 반환합니다. HashSet은 일반적으로 비교할 필요가없는 다른 엔티티에 대한 탐색 링크입니다.

올바르게 작동시키기 위해이 코드를 수정할 수 있습니까?

namespace Common.Helper 
{ 
    public sealed class PocoHelper<TPOCO> : IEqualityComparer<TPOCO> where TPOCO : class 
    { 
     public bool Equals(TPOCO poco1, TPOCO poco2) 
     { 
      var t = typeof(TPOCO); 

      if (poco1.IsNotNull() && poco2.IsNotNull()) 
      { 
       bool areSame = true; 

       foreach(var property in typeof(TPOCO).GetPublicProperties()) 
       { 
        object v1 = property.GetValue(poco1, null); 
        object v2 = property.GetValue(poco2, null); 

        if (!object.Equals(v1, v2)) 
        { 
         areSame = false; 
         break; 
        } 
       }; 

       return areSame; 
      } 

      return poco1 == poco2; 
     } 

     public int GetHashCode(TPOCO poco) 
     { 
      int hash = 0; 
      foreach(var property in typeof(TPOCO).GetPublicProperties()) 
      { 
       object val = property.GetValue(poco, null); 
       hash += (val == null ? 0 : val.GetHashCode()); 
      }; 
      return hash; 
     } 
    } 
} 
+0

IEqualityComparer – IamStalker

+0

을 사용해야합니다. 따라서 비교에서 HashSets를 제외시키는 방법을 찾아야합니다. 너무 어렵지 않아야합니다. –

+0

@IamStalker - 자세히 설명해 주시겠습니까? – dotnetnoob

답변

-1

비교할 개체 중 하나 또는 둘 다 null 인 경우 false를 반환해야합니다.

 if (poco1.IsNotNull() && poco2.IsNotNull()) 
     { 
      bool areSame = true; 

      foreach(var property in typeof(TPOCO).GetPublicProperties()) 
      { 
       object v1 = property.GetValue(poco1, null); 
       object v2 = property.GetValue(poco2, null); 

       if (!object.Equals(v1, v2)) 
       { 
        areSame = false; 
        break; 
       } 
      }; 

      return areSame; 
     } else { 
      return false; 
     } 

MSDN에 주어진대로 "=="

// Returns true. 
    Console.WriteLine("null == null is {0}", null == null); 

당신은 hashsets에 관한 http://msdn.microsoft.com/en-gb/library/edakx9da.aspx

에서 볼 수 있습니다 true를 반환 것 때문에 : 는 HashSet에의 오브젝트 유형이 없습니다 IEqualityComparer를 구현하는 대신 Object.GetHashCode() 및 Object.Equals (Object obj)를 재정의해야합니다. How does HashSet compare elements for equality?