创建任意对象的字典
本文关键字:字典 对象 任意 创建 | 更新日期: 2023-09-27 18:12:38
我想要的是存储名称、对象对的能力。
不像objC, c#的Dictionary
需要类型。在objC中,我将使用id
表示"任何对象"。
我该如何在c#中管理这个呢?
所以我要找的是:
Dictionary<String,id>
.
很抱歉,如果这是真的基本!
无需花费大量精力与多个强类型对象列表对话,实现这一点的最简单方法是使用Dictionary<string, object>
并在需要时抛出对象类型:
int i = (int)myDictionary["Age"];
string n = (string)myDictionary["Name"];
这里有一些动态选项,如ExpandoObject
:
如果您使用对象字典方法,请注意值类型的装箱。使用动态方法不会产生装箱影响,但需要运行时分辨率,因此性能再次受到轻微影响。
没有什么是免费的,但总的来说,您不应该看到这个小开销的影响。
如果拆箱是一个问题,. net 4中总是有新的动态类型。
我不确定我是否理解对了,但是你可以这样做:
<>之前字典s = new Dictionary();对象a = new Int32();A = 1;对象b = new Double();B = 2.0;s.Add("a");s.Add (b, b);Int32 v = Convert.ToInt32(s["a"]);Double u = Convert.ToDouble(s["b"]);控制台。WriteLine(v + " " + u);问这个问题可能表明这背后隐藏着一些糟糕的设计。当你需要一个异构对象的集合时,它总是这样做的。
由于不知道集合中对象的类型,因此总是需要进行某种类型检查,例如if (dictionary["xy"] is string) {...}
,这是一种代码气味。
将某种形式的包装到一个共同的类是一个选项吗?这将允许您对它指定一些通用操作(因为如果您需要它在同一个字典中,您可能需要一些通用操作)。例如(将其视为伪代码):
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>
,并使用在Base上定义的操作,如ToString
或任何自定义。