2016-11-21 8 views
1

MVVM 패턴의 경우 두 가지 유형 사이의 관계를 저장하기 때문에 사용자 정의 비교기가있는 사전 (사전)이 있는데, 필요한 경우 가져 오는 데 도움이 필요합니다. 사용자 정의 EqualityComparer가 작동합니다.EqualityComparer <Type> GetHashCode 및 같음

GetHashCode 메서드가 Equals 메서드보다 먼저 호출되는 것을 발견했습니다. 해시 코드를 올바르게 가져올 수 있습니까? 예기치 않은 동작입니다. 사전에서 "Square"를 얻으려고 시도하면됩니다. , 그것은 "GeometricShape"의 값을 반환 이미에서 "GeometricShape는"난 당신이 비교자를 가질 수 없습니다

public class DictionaryComparer : EqualityComparer<Type> 
{ 
    public override bool Equals(Type x, Type y) 
    {    
     return x.IsAssignableFromType(y); 
    } 

    public override int GetHashCode(Type obj) 
    { 
     return obj.GetHashCode(); 
    } 
} 
+0

이 질문에 대한 설명이 필요합니다. 당신이 사전에 말해 주려고 노력하고 있습니까? 만약 당신이 X (사전에없는) 키에 접근하고 X '키를 가지고 있다면, 나중에 값을 돌려 주어야합니까? 그렇다면 사전에 이미있는 다른 키에 할당 할 수있는 키를 추가 할 수 없다는 사실을 알고 있습니까? –

+0

나는 직업에 대해 잘못된 도구를 사용하려고한다는 느낌이 들지만 (틀릴 수도 있지만). 당신이 이걸로 무엇을 이루려고하는지 설명해 주시겠습니까? –

+0

MVVM 및 사전. 그것은 코드 냄새입니다. 먼저 KeyedCollections로 전환하거나 대신 키 생성 된 컬렉션의 필요성을 제거 할 것을 제안합니다. 당신이 평등하려고하는 것에 대해서는 ... 확실하지 않습니다. – Will

답변

2

예상 된 결과를 제공하는 방법으로 그것을 해시 수있는 방법을 찾을 수 없습니다 동등성 조작으로 "from assignable"을 사용합니다.

Equals에는 의존하는 클래스에서 가정 한 특정 규칙이 있습니다. 그런 비교자를 사용하는 규칙 결과를 깨면 본질적으로 임의로 뒤범벅이됩니다.

Guidelines for Overloading Equals()

x.Equals(x) true를 반환 참조하십시오.
x.Equals(y)
과 동일한 값을 반환합니다. (x.Equals(y) && y.Equals(z))이 true를 반환하면 x.Equals(z)이 true를 반환합니다.

난 당신이 당신이 단지 Dictionary<Type,Type>이과에 직접 유형을 넣어 다른 하나 개의 유형을 매핑 할 필요가 가능한 경우, 특정 사건을 해결하는 방법을 정말 모르겠어요.