2016-11-21 22 views
1

MVVMパターンの2つの型の間の関係を保存したいので、私は型の辞書(Dictionary)をカスタムのcomparerで使用しています。カスタムEqualityComparerが動作します。EqualityComparer <Type> GetHashCode and Equals

私は、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)リターンを参照してください。
x.Equals(y)は、
と同じ値を返します。(x.Equals(y) && y.Equals(z))がtrueを返した場合は、x.Equals(z)がtrueを返します。

私はあなたの特定のケースを解決する方法が本当にわからない、あなただけの別のタイプをマッピングする必要がある可能性があれば、あなただけのDictionary<Type,Type>を持っており、それに直接型を置きます。

関連する問題