我想要的是存储名称,对象对的能力。
与objC不同,c#的Dictionary
需要类型。在objC中,我会使用id
来表示“任何对象”。
我将如何在c#中管理它。
所以我正在寻找的是:
Dictionary<String,id>
。
对不起,如果这是非常基本的话!
答案 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
或任何自定义。