2016-11-21 14 views
1

У меня есть словарь типов (Словарь) с пользовательским сопоставлением, потому что мы хотим хранить отношения между двумя заданными типами (для шаблона MVVM), и мне нужна помощь, способная получить способ получить пользовательский EqualityComparer для работы.EqualityComparer <Type> GetHashCode и Equals

Выполнение некоторых исследований Я обнаружил, что метод GetHashCode вызывается перед методом Equals, как я могу получить хэш-коды правильно ?, ожидаемое поведение это, если я попытаюсь получить «квадрат» из моего словаря, и он имеет а «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

Вы не можете иметь компаратор который использует «присваиваемый из» в качестве операции эквивалентности.

Equals имеет особые правила, принятые классами, которые полагаются на него. Если вы нарушаете правила, результаты использования такого компаратора будут по существу случайными перетасовками.

См Guidelines for Overloading Equals()

x.Equals(x) возвращает истину.
x.Equals(y) возвращает то же значение, что и y.Equals(x)
, если (x.Equals(y) && y.Equals(z)) возвращает true, то x.Equals(z) возвращает true.

Я не совсем уверен, как решить частный случай, возможно, если вам просто нужно отобразить один вид на другой, вы просто Dictionary<Type,Type> и поставить типы непосредственно к нему.