创建任何对象的字典

时间:2011-10-27 10:23:16

标签: c# dictionary

我想要的是存储名称,对象对的能力。

与objC不同,c#的Dictionary需要类型。在objC中,我会使用id来表示“任何对象”。

我将如何在c#中管理它。

所以我正在寻找的是:

Dictionary<String,id>

对不起,如果这是非常基本的话!

4 个答案:

答案 0 :(得分:4)

与多个强类型的对象列表交谈没有太多的了解,最简单的方法是使用Dictionary<string, object>并根据需要强制转换对象类型:

int i = (int)myDictionary["Age"];
string n = (string)myDictionary["Name"];

此处有一些动态选项,例如ExpandoObject

http://msdn.microsoft.com/en-us/library/system.dynamic.expandoobject.aspx

如果你采用对象字典方法,请注意boxing on value types。使用动态方法不会产生影响,但需要运行时解析,因此性能再次受到轻微影响。

没有什么是免费的,但总的来说你不应该看到这种轻微开销的影响。

答案 1 :(得分:0)

如果取消装箱是一个问题,.NET 4中总会有新的动态类型。

答案 2 :(得分:0)

不确定我是否理解正确但你可以做到以下几点:


    Dictionary s = new Dictionary();
    Object a = new Int32();
    a = 1;
    Object b = new Double();
    b = 2.0;
    s.Add("a", a);
    s.Add("b", b);
    Int32 v = Convert.ToInt32(s["a"]);
    Double u = Convert.ToDouble(s["b"]);
    Console.WriteLine(v + " " + u);

答案 3 :(得分:-1)

询问这可能表明这背后隐藏着一些糟糕的设计。当你需要一组异质对象时,它总是会这样做。

由于不知道集合中的对象类型,您总是需要进行某种类型检查,例如if (dictionary["xy"] is string) {...}这是一种代码气味。

将某种包装成普通类是一种选择吗?这将允许您在其上指定一些常见操作(因为如果您需要它在同一个dict中,您可能需要一些常见操作)。例如(将其视为伪代码):

class Base
{
   bool IsCollection;
}

class StringItem : Base
{
   string Contents;
   IsCollection = false;
   override ToString() { return this.Contents; }
}

class ListItem : Base
{
   List<StringItem> Contents;
   IsCollection = true;
   override ToString() { return string.Join(",", this.Contents.ToArray() }
}

然后你可以拥有Dictionary<string, Base>并使用在基础上定义的操作,例如ToString或任何自定义。