匿名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关键字?