声明匿名类型列表

时间:2010-02-24 16:24:08

标签: c# asp.net c#-3.0 anonymous-types

有没有办法声明匿名类型的列表对象。我的意思是

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

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

8 个答案:

答案 0 :(得分:76)

动态怎么样?

List<dynamic> dynamicList = new List<dynamic>();


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

答案 1 :(得分:60)

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

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"}}
                );

答案 2 :(得分:52)

你可以制作一个这样的列表,但你将再次使用一些严重的hackery,你将不得不使用一些“逐个例子”的情况。例如:

// 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" } });

答案 3 :(得分:26)

一般情况下,您可以使用其他人提到过的示例技巧(可以说是难闻的)来创建使用类型参数的匿名类型参数化的任何泛型类型的实例。但是,对于List<T>,执行此操作的方式略有不足:

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

您提出的语法草图类似于我们未针对C#3或4实现的功能,但我们考虑过。我们将这个功能称为“mumble types”,它会是这样的:

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

我们称之为“mumble types”,因为你当然读过它“myList是一个新的hrmmf列表”。 :-)

这个想法是编译器会查看初始化器并尽力弄清楚类型可能是什么,就像“var”意味着“查看初始化器并找出类型的变量是“。我们是否使用“var”作为“mumble”或“?” (类似于Java在相关功能中所做的那样),或其他东西是一个悬而未决的问题。

无论如何,如果我是你,我不会屏住呼吸等待这个功能。到目前为止,它还没有针对几种语言版本进行剪辑,但我认为它会在一段时间内保留在可能性列表中。假设,假设我们要设计该语言的未来版本。我们可能会或可能不会。请记住,Eric对未来C#版本的思考仅用于娱乐目的。

答案 4 :(得分:15)

你不能像这样建立一个匿名类型的集合。

如果您需要这样做,则需要使用List<object>,或为您的类型制作自定义类或结构。


编辑:

我会改写一下:

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

自定义类型将具有所有相同的功能(因为匿名类型是由编译器在编译时定义的),但跟随您的开发人员将更容易理解...


只是为了玩,这里是我的“我从未真正想要在现实世界中使用的代码”的条目:

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

答案 5 :(得分:12)

这种方法比许多其他建议更清晰:

var list = Enumerable.Repeat(new { Name = "", Phones = new[] { "" } }, 0)
               .ToList();

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

答案 6 :(得分:9)

我花了很多时间试图找到一种方法来使用匿名类型列表来节省一些时间,然后意识到在当前类中使用私有类可能更快......

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...

}

答案 7 :(得分:2)

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

相关问题