문제

또한보십시오 데이터 전송 두 객체에 C#에 동일한 속성이 있는지 빠르게 확인하는 방법은 무엇입니까?

각각 포함하는 데이터 전송 개체 (DTO)가 많이 있습니다. 많은 간단한 필드. 나는 그들 모두에 대해 동등한 것을 구현해야합니다 (따라서 var wcf를 전송하는 단위 테스트를 작성할 수 있습니다).

내가 사용하는 코드는 다음과 같습니다.

public override bool Equals(object rhs)
{

    RequestArguments other = rhs as RequestArguments;

    return
       other != null && 
       other.m_RequestId.Equals(RequestId) && 
       other.m_Type.Equals(m_Type) && 
       other.m_Parameters.Equals(m_Parameters) && 
       other.m_user.Equals(m_user);
}

더 나은 방법이 있어야합니다! ... (모든 필드를 나열하는 것은 오류 및 유지 보수 문제를 요구하는 것입니다)

예 : 우리는 대상이 있습니다. Cloning () 케이스를 돕기 위해 Memberwiseclone ()은 이에 도움이되는 것을 찾을 수 없습니다. 우리는 완전한 신뢰로 실행되므로 반사 기반 솔루션은 하나의 답변이지만 오히려 바퀴를 재발 명하지 않습니다.

(죄송합니다 우리는 도메인 별 언어에서 DTO를 생성하지 않아서 이런 종류의 일이 쉬울 것입니다! 또한 다른 단계를 추가하기 위해 빌드 시스템을 변경할 수 없습니다)

도움이 되었습니까?

해결책

재미있게 물어봐야합니다. 나는 최근에 정확하게 그렇게하기위한 코드를 게시했습니다. 내 확인 memberwiseequality comparer 그것이 당신의 요구에 맞는지 확인합니다.

사용하기 쉽고 매우 효율적입니다. IL-EMIT를 사용하여 첫 번째 실행에서 전체 평형 및 gethashcode 함수를 생성합니다 (사용 된 각 유형에 대해 한 번). 해당 유형의 기본 평등 비교 (EqualityComparer.Default)를 사용하여 주어진 개체의 각 필드 (개인 또는 공개)를 비교합니다. 우리는 한동안 생산에서 그것을 사용해 왔으며 안정적으로 보이지만 보증을 남기지 않을 것입니다 =)

그것은 당신이 자신의 평등 방법을 굴릴 때 거의 생각하지 않는 모든 pescy edge cases를 처리해야합니다 (즉, 먼저 상자에 박스를 뽑고 로트를 끄지 않는 한 자신의 객체를 null과 비교할 수 없습니다. 더 많은 널 관련 문제).

나는 그것에 대한 블로그 게시물을 작성하는 것을 의미했지만 아직 그것에 대해서는 얻지 못했습니다. 코드는 약간 문서화되지 않았지만 마음에 들면 약간 청소할 수 있습니다.

public override int GetHashCode()
{
    return MemberwiseEqualityComparer<Foo>.Default.GetHashCode(this);
}

public override bool Equals(object obj)
{
    if (obj == null)
        return false;

    return Equals(obj as Foo);
}

public override bool Equals(Foo other)
{
    return MemberwiseEqualityComparer<Foo>.Default.Equals(this, other);
}

Memberwiseequality Comparer는 MIT 라이센스 Meaining은 라이센스를 약간 변경하지 않고 독점 솔루션에서 사용하는 것을 포함하여 원하는대로 거의 할 수 있습니다.

다른 팁

옵션은 반사를 사용하여 사용 가능한 모든 필드를 얻은 다음 원하는 객체에서 해당 값을 얻고 비교하는 것입니다. 이것은 일반적인 솔루션을 제공하지만 Alex가 제안한 것처럼 해시를 사용하는 것이 더 깨끗한 솔루션 일 것입니다.

편집하다: 반사를 사용하여 객체를 비교하는 간단한 예는 다음과 같습니다. 필드 대신 속성을 살펴 보지만 아이디어를 얻을 수 있습니다. http://www.willasrari.com/blog/use-systemreflection-for-comparing-custom-objects/000257.aspx

당신은 객체 해시의 개념을 가질 수 있습니다 - 객체가 변경 될 때마다 해시를 업데이트하는 가격을 지불합니다 (해시는 문자 그대로 연결된 속성의 해시입니다). 그런 다음 거의 변하지 않는 물건이 많이 있다면 비교하는 것이 정말 저렴합니다. 물론 가격은 물체 편집 시간에 지불됩니다.

편집하다: 죄송합니다. 직렬화 테스트를 요구하고 있다는 것을 알지 못했습니다. 따라서이 접근법은 확실히 효과가 없습니다.


또 다른 "더러운"방법이 있습니다. 어쨌든 객체가 직렬화 가능하면 가능합니다 직렬화 결과 스트림을 비교하십시오.

이것은 다소 느리지 만 신뢰할 수 있고 구현하기 쉽습니다.

우리는 누군가가 편집자의 데이터를 변경했는지 확인하기 위해 때때로이 작업을 수행하고 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top