C# 使用匿名对象初始化字典

C# 使用匿名对象初始化字典,c#,dictionary,initialization,anonymous-types,C#,Dictionary,Initialization,Anonymous Types,我试着做以下几点 private static Dictionary<int, object> MAPS = new Dictionary<int, object> { {1, new {1, 2, 3}} }; 私有静态字典映射=新字典 { {1,新的{1,2,3} }; 它不能像我所期望的那样工作,所以我很确定问题在于我使用的是匿名对象。假设我不想为我的东西创建一个新类型,但仍然想将所有映射保留在同一个字典中,我该怎么办 我已经看到了,但是现在有点过时了,所以

我试着做以下几点

private static Dictionary<int, object> MAPS = new Dictionary<int, object>
{
  {1, new {1, 2, 3}}
};
私有静态字典映射=新字典
{
{1,新的{1,2,3}
};
它不能像我所期望的那样工作,所以我很确定问题在于我使用的是匿名对象。假设我不想为我的东西创建一个新类型,但仍然想将所有映射保留在同一个字典中,我该怎么办


我已经看到了,但是现在有点过时了,所以我希望在框架中有一些新的东西。

如果您想要一个
int
s数组作为值,请尝试这个

private static Dictionary<int, object> MAPS = new Dictionary<int, object>
{
  {1, new[] {1, 2, 3}}
};
私有静态字典映射=新字典
{
{1,新[]{1,2,3}
};
或者,如果你想要一个匿名类

private static Dictionary<int, object> MAPS = new Dictionary<int, object>
{
  {1, new { a = 1, b = 2, c = 3}}
};
私有静态字典映射=新字典
{
{1,新的{a=1,b=2,c=3}
};

或者最好不要使用
对象
。对于
int
的集合使用
int[]
List
,或者如果需要特定值,则声明类或结构。如果每个值只需要3个
int
s,甚至可以使用
Tuple
。但是,一般来说,您应该尽量避免在
对象

之间进行强制转换,语法
新的{1,2,3}
是。要创建什么类型的对象

使用类似于
new{elements=new[]{1,2,3}}
的方法为匿名对象提供一个包含整数的
elements
属性


或者您可以命名单个属性:
new{foo=1,bar=2,baz=3}

匿名类型只是具有属性的类型,您的匿名类型没有属性:

private static Dictionary<int, object> MAPS = new Dictionary<int, object>
{
    {1, new { Prop1 = 1, Prop2 = 2, Prop3 = 3}}
};
现在,这项工作:

var value = MAPS[1].CastByPrototype(prototype);  // you can use value.Prop1

如果原型没有相同的属性(以相同的顺序),则会出现
InvalidCastException

进一步了解@TimSchmelter和@juharr的答案,如果您希望能够通过属性名称引用属性,但不想创建一个类,则可以使用
dynamic
(虽然很明显,您无法获得任何intellisense,因此其使用受到限制):


使用
对象
动态
的唯一好处是,您可以在其中存储不同类型的集合。如果您只存储
int
s,则最好使用
列表
int[]

我想要一个字典,对于给定的整数,它会给我两个不同的整数。哦,我尝试在新运算符和角度中的对象类型上设置括号。我尝试了冒号而不是等号。愚蠢的JSON损坏了我…:)+1可以键入a吗。b和c而不为它们声明类?它们将隐式地采用您设置它们的类型,因此如果需要,您可以强制转换该值。但是这里匿名类的主要问题是,当您从字典中提取值时,无法对其进行强制转换。你可能想研究一下如何使用
动态
而不是
对象
。呵呵,@juharr比你快。慢手指日?;)这是个好问题。我必须强制转换映射[1][0]还是有办法隐式地强制类型存在?@KonradViltersten如果你想通过
MAPS[1][0]
获得一个值,那么为什么不把它变成
字典
字典
如果您能显示实际的编译器错误,即“无效的匿名类型成员声明器。匿名类型成员必须使用成员分配、简单名称或成员访问权声明”。@CodeCaster。我以为这是一些基本的东西,我只是脑子有点问题。但你是对的,没有争论
var prototype = new { Prop1 = 0, Prop2 = 0, Prop3 = 0 };
var value = MAPS[1].CastByPrototype(prototype);  // you can use value.Prop1
Dictionary<int, object> MAPS = new Dictionary<int, object>
{
    {1, new { a = 1, b = 2, c = 3} as dynamic}
};

Console.WriteLine(((dynamic)MAPS[1]).b); //prints 2
Dictionary<int, dynamic> MAPS = new Dictionary<int, object>
{
    {1, new { a = 1, b = 2, c = 3}}
};

Console.WriteLine(MAPS[1].b); //prints 2