我试图做以下事情。
private static Dictionary<int, object> MAPS = new Dictionary<int, object>
{
{1, new {1, 2, 3}}
};
根据MSDN,我的工作并不合适,所以我很确定问题是我使用的是匿名对象。假设我不想为我的东西创建一个新类型,并且仍然希望将所有映射保留在同一个字典中,我该怎么办?
我已经看过this answer,但现在有点过时了,所以我希望在框架中有新的东西。
答案 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
使用object
或dynamic
的唯一好处是您可以在其中存储包含不同类型的集合。如果您只存储int
s,那么最好使用List<int>
或int[]
。