当前位置:  开发笔记 > 编程语言 > 正文

异类字典,但键入?

如何解决《异类字典,但键入?》经验,为你挑选了1个好方法。

这更像是一个学术探究,而不是一个实际问题.是否有任何语言或框架功能可以或将来允许异构类型的dcitionary,例如

myDict.Add("Name", "Bill"); 
myDict.Add("Height", 1.2); 

myDict现在不包含两种object类型的值,而是一个string和一个double?然后我可以找回我double

double dbl = myDict["Height"];

并期望抛出一个双重或异常?

请注意:Name和Height值不一定是同一个对象.



1> Wilka..:

如果您的自定义集合具有Add和Get方法的泛型重载,那么您将能够执行此操作的唯一方法.但这意味着你在阅读密钥时可以要求输入错误的类型,因此当你调用Get方法时,你自己做了很多(如果有的话).

但是,如果您可以将泛型类型推入密钥,则可以使用.像(未经测试的代码)

sealed class MyDictionaryKey
{
}

class MyDictionary
{
    private Dictionary dictionary = new Dictionary();

    public void Add(MyDictionaryKey key, T value)
    {
        dictionary.Add(key, value);
    }

    public bool TryGetValue(MyDictionaryKey key, out T value)
    {
      object objValue;
      if (dictionary.TryGetValue(key, out objValue))
      {
        value = (T)objValue;
        return true;
      }
      value = default(T);
      return false;
    }

    public T Get(MyDictionaryKey key)
    {
      T value;
      if (!TryGetValue(key, out value))
         throw new KeyNotFoundException();
      return value;
    }
}

然后你可以定义你的键,如:

static readonly MyDictionaryKey NameKey = new MyDictionaryKey();
static readonly MyDictionaryKey HeightKey = new MyDictionaryKey();

并使用它

var myDict = new MyDictionary();
myDict.Add(NameKey, "Bill"); // this will take a string
myDict.Add(HeightKey , 1.2); // this will take a double

string name = myDict.Get(NameKey); // will return a string
double height = myDict.Get(HeightKey); // will return a double

推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有