我认为这可能是一个常见的问题,但我没有找到任何关于它的帖子。
我在下面写一些伪代码。如果你想编译代码,请忽略这篇文章。
所以说两个类:一个基类和一个子类。注意:两个类都具有重写Equals()和GetHashCode()函数,以确保与相同属性的相等性。
public class A // A has a string property of name
public class B:A // B has a string property of title
var a = new A{name = "bob"};
var b = new B{name = "bob", title = "em"};
有些代码有一个基于A的字典
var dict = new Dictionary<A>();
例如,做一些添加的东西,
dict.Add(a);
但是,如果我使用/ o类型转换搜索派生类,则查找函数将引发KeyNotFoundException
dict[b];
字典将计算B的哈希码而不是A,并根据它提出异常。
一个简单而尴尬的解决方案是根据B的属性创建一个新的A实例。
dict[new A{name = b.name}];
我想知道是否有更好的解决方案?
尝试创建EqualityComparer,并在字典的构造函数中传递它的实例。
class AEqualityComparer : IEqualityComparer<A>
{
public bool Equals(A x, A y)
{
return x.Equals(y);
}
public int GetHashCode(A obj)
{
return obj.GetHashCode();
}
}
var dict = new Dictionary<A, object>(new AEqualityComparer());
使用字典的键将列表中的对象存储起来很困惑。如果使用对象作为键,则需要提供对同一对象的引用 - 而不仅仅是具有相同属性的对象。
如果你这样做:
dict.Add(new A{name = "bob"}, someData);
然后这样做
var result = dict[new A{name = "bob"}];
你会得到'找不到钥匙',因为这两个新的A
s是不同的对象。