Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建任何对象的字典_C#_Dictionary - Fatal编程技术网

C# 创建任何对象的字典

C# 创建任何对象的字典,c#,dictionary,C#,Dictionary,我想要的是能够存储名称、对象对 与objC不同,c#的字典需要类型。在objC中,我将使用id来表示“任何对象” 我将如何在c#中处理此问题 所以我要找的是: 字典 对不起,如果这是真的基本 如果取消装箱是一个问题,那么.NET 4中总会有新的动态类型。不必花太多时间谈论多个强类型的对象列表,实现这一点的最简单方法是使用字典,并根据需要丢弃对象类型: int i = (int)myDictionary["Age"]; string n = (string)myDictionary["Name"]

我想要的是能够存储名称、对象对

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

我将如何在c#中处理此问题

所以我要找的是:

字典


对不起,如果这是真的基本

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

不必花太多时间谈论多个强类型的对象列表,实现这一点的最简单方法是使用
字典
,并根据需要丢弃对象类型:

int i = (int)myDictionary["Age"];
string n = (string)myDictionary["Name"];
这里有一些动态选项,例如
ExpandoObject

如果使用对象字典方法,请注意。使用动态方法不会产生装箱影响,但需要运行时解析,因此性能也会受到轻微影响


没有任何东西是免费的,但总的来说,你不应该看到这种小开销的影响。

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

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); 字典s=新字典(); 对象a=新的Int32(); a=1; 对象b=新的Double(); b=2.0; s、 添加(“a”,a); s、 添加(“b”,b); Int32 v=转换为Int32(s[“a”]); 双u=Convert.ToDouble(s[“b”]); 控制台写入线(v+“”+u);
问这个问题可能表明这背后隐藏着一些糟糕的设计。当您需要一组异构对象时,它总是这样做

由于不知道集合中对象的类型,因此始终需要执行某种类型的类型检查,例如
if(dictionary[“xy”]是string){…}
,这是一种代码味道

将某种形式的包装到公共类中是一种选择吗?这将允许您对它指定一些公共操作(因为如果您需要它位于同一目录中,则可能需要一些公共操作)。例如(将其视为伪代码):

类基
{
布尔收集;
}
类StringItem:基
{
字符串内容;
IsCollection=false;
重写ToString(){返回this.Contents;}
}
类ListItem:Base
{
列出内容;
IsCollection=true;
重写ToString(){return string.Join(“,”,this.Contents.ToArray()}
}

然后,您可以拥有一个
字典
,并使用在基础上定义的操作,例如
ToString
或任何自定义操作。

字典
,带有一个cast以将其取出?如果您打算使用值类型,可能会有装箱含义。装箱含义是什么?大多数
对象
都将是字符串,但在少数情况下是字符串案例它们可能会列出您看到的字符串。@ThomasClayson:string和list都不是值类型,因此不会涉及任何装箱(如果您不知道,请进行一些搜索以了解装箱的更多信息…)
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() }
}