匿名types声明列表

有什么办法来声明匿名types的列表对象。 我的意思是

List<var> someVariable = new List<var>(); someVariable.Add( new{Name="Krishna", Phones = new[] {"555-555-5555", "666-666-6666"}} ); 

这是因为我需要在运行时创build一个集合。 提前致谢

它涉及到一些骇客,但可以做到。

 static List<T> CreateListFromSingle<T>(T value) { var list = new List<T>(); list.Add(value); return list; } var list = CreateListFromSingle( new{Name="Krishna", Phones = new[] {"555-555-5555", "666-666-6666"}} ); 

dynamic如何?

 List<dynamic> dynamicList = new List<dynamic>(); dynamicList.Add(new { Name = "Krishna", Phones = new[] { "555-555-5555", "666-666-6666" } }); 

你可以像这样做一个列表,但是你必须再次使用一些严重的hackery,你将不得不使用一些“按types”的情况。 例如:

 // create the first list by using a specific "template" type. var list = new [] { new { Name="", Phones=new[] { "" } } }.ToList(); // clear the list. The first element was just an example. list.Clear(); // start adding "actual" values. list.Add(new { Name = "Krishna", Phones = new[] { "555-555-5555", "666-666-6666" } }); 

一般来说,你可以使用其他人已经提到过的(可以说是难闻的)通过示例技巧进行的转换来创build任何通用types的实例,这些实例的types参数使用匿名types进行参数化。 然而,对于List<T>来说,这样做总的来说稍微有些不足:

 var array = new[] { new { Name="Krishna", Phones = new[] {"555-555-5555", "666-666-6666"} } }; var list = array.ToList(); 

您提出的语法草图类似于我们没有为C#3或4实现的function,但是我们已经考虑过了。 我们称这个function为“嘟嘟types”,它会是这样的:

 List<?> myList = new List<?>() { new { Name="Krishna", Phones = new[] {"555-555-5555", "666-666-6666"} } }; 

我们称之为“笨蛋types”,因为当然你会读它“myList是一个新的hrmmf列表”。 🙂

这个想法是,编译器会查看初始化器,并尽力弄清楚types可能是什么,就像“var”意思是“查看初始化器并找出variables的types是什么”。 不pipe我们用“var”作为“嘟嘟”还是“?” (类似于Java在相关function中所做的),或者其他的东西是一个开放的问题。

无论如何,如果我是你,我不会屏住呼吸等待这个function。 到目前为止,它还没有削减几个语言版本,但是我认为它会在一段时间内保持在可能的状态。 假设我们要devise未来版本的语言。 我们可能会或可能不会。 请记住,Eric对C#未来版本的思考只是为了娱乐目的。

你不能像这样做一个匿名types的集合。

如果您需要这样做,则需要使用List<object> ,或者为您的types创build自定义的类或结构。


编辑:

我会重申一下:

虽然在技术上可以列出一个匿名types,但我强烈build议不要这样做。 总是有一个更好的方法,因为这样做只是使代码几乎不可维护。 我强烈build议使自定义types来保存您的值,而不是使用匿名types。

一个自定义types将具有所有相同的function(因为匿名types是由编译器在编译时定义的),但是跟随你的开发者会更容易理解…


而且,为了演奏,这里是我的“我真的不想在现实世界中使用的代码”的条目:

 var customer = new { Name = "Krishna", Phones = new[] { "555-555-5555", "666-666-6666" } }; var someVariable = new[]{1}.Select(i => customer).ToList(); 

我花了相当多的时间试图find一种方法来保存自己一段时间使用匿名types的列表,然后意识到它可能更快,只是在当前类中使用私人类…

 private class Lookup { public int Index; public string DocType; public string Text; } private void MyMethod() { List<Lookup> all_lookups = new List<Lookup> { new Lookup() {Index=4, DocType="SuperView", Text="SuperView XML File"}, new Lookup() {Index=2, DocType="Word", Text="Microsoft Word Document"} }; // Use my all_lookups variable here... } 

这里有一个比其他许多build议更清洁的方法:

 var list = Enumerable.Repeat(new { Name = "", Phones = new[] { "" } }, 0) .ToList(); // ... list.Add(new { Name = "Krishna", Phones = new[] { "555-555-5555", "666-666-6666" } }); 

我不认为这是可能的。 也许在C#4中使用dynamic关键字?