使用匿名对象初始化字典

时间:2014-10-17 11:19:18

标签: c# dictionary initialization anonymous-types

我试图做以下事情。

private static Dictionary<int, object> MAPS = new Dictionary<int, object>
{
  {1, new {1, 2, 3}}
};

根据MSDN,我的工作并不合适,所以我很确定问题是我使用的是匿名对象。假设我不想为我的东西创建一个新类型,并且仍然希望将所有映射保留在同一个字典中,我该怎么办?

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

4 个答案:

答案 0 :(得分:5)

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

private static Dictionary<int, object> MAPS = new Dictionary<int, object>
{
  {1, new[] {1, 2, 3}}
};

或者如果你想要一个匿名类

private static Dictionary<int, object> MAPS = new Dictionary<int, object>
{
  {1, new { a = 1, b = 2, c = 3}}
};

或者更好的是不要使用object。如果需要特定值,请使用int[]List<int>作为int的集合或声明类或结构。如果每个值只需要3 Tuple<int,int,int> s,甚至可以使用int。但是,一般来说,你应该尽量避免使用object进行强制转换。

答案 1 :(得分:2)

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

private static Dictionary<int, object> MAPS = new Dictionary<int, object>
{
    {1, new { Prop1 = 1, Prop2 = 2, Prop3 = 3}}
};

但是你想如何从对象转变为那种无趣的类型?

编辑那里有好问题。我是否必须转换MAPS [1] [0]或者是否有办法在那里隐式强制类型?

如果没有类似此扩展方法的黑客,则无法将对象强制转换为匿名类型:

public static T CastByPrototype<T>(this object obj, T prototype)
{
    return (T)obj;
}

它使用原型匿名类型,如:

var prototype = new { Prop1 = 0, Prop2 = 0, Prop3 = 0 };

现在可行:

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

如果原型具有相同的属性(按相同顺序),则失败并显示InvalidCastException

答案 2 :(得分:1)

语法new {1, 2, 3}not a collection initializer nor an anonymous object initializer。您想要创建什么类型的对象?

使用类似new { elements = new[] { 1, 2, 3 } }的内容为匿名对象提供包含整数的elements属性。

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

答案 3 :(得分:1)

除了来自@TimSchmelter和@juharr的答案之外,如果你想通过他们的名字引用这些属性,但是你不想创建一个类,你可以使用dynamic(虽然显然你赢了得到任何intellisense所以它的使用是有限的):

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成为Dictionary<int, dynamic>,你可以放弃演员阵容,让生活变得更轻松:

Dictionary<int, dynamic> MAPS = new Dictionary<int, object>
{
    {1, new { a = 1, b = 2, c = 3}}
};

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

使用objectdynamic的唯一好处是您可以在其中存储包含不同类型的集合。如果您只存储int s,那么最好使用List<int>int[]