键入字典键的安全性?

msk*_*her 1 c# generics dictionary

我打算在项目中使用多个名称索引字典.我的第一选择是使用一个string键,它只是我Value元素的Name属性.

但是,即使它们访问不同类型,这也会使字典键完全相同:

private Dictionary<string, Foo> myFoos;
private Dictionary<string, Bar> myBars;

myFoos[bar.Name];  // shouldn't be able to do this!
Run Code Online (Sandbox Code Playgroud)

我希望密钥彼此不兼容,使它们无法互相混淆:

private Dictionary<FooName, Foo> myFoos;
private Dictionary<BarName, Bar> myBars;
Run Code Online (Sandbox Code Playgroud)

由于*Name为每种Value类型创建一个类是过度的,我创建了一个Name<T>类:

public struct Name<T>
{
    public string Name;

    // for convenience, could be explicit instead
    static implicit operator string(Name<T> name)
    {
        return name.Name;
    }
}
Run Code Online (Sandbox Code Playgroud)

这会给我

private Dictionary<Name<Foo>, Foo> myFoos;
private Dictionary<Name<Bar>, Bar> myBars;
Run Code Online (Sandbox Code Playgroud)

然后我可以存储Name<Foo>实例而不是字符串.

这看起来有点笨拙,但这是迄今为止我提出的最好的 - 有关如何做得更好的任何建议吗?
这是误导,还是很棒?

SLa*_*aks 5

这将工作,但您需要重写Equals,并GetHashCode作出由值进行比较的名字.