Объявление списка анонимных типов

Есть ли способ объявить объект списка анонимного типа. Я имею в виду

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

Это потому, что мне нужно создать коллекцию во время выполнения.

Ответ 1

Это связано с небольшим количеством хакеров, но это можно сделать.

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

Как насчет динамического?

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


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

Ответ 3

Вы можете сделать такой список, но вам снова придется использовать серьезный хакер, и вам придется использовать некоторые ситуации типа "пример". Например:

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

Ответ 4

В общем, вы можете использовать (возможно, плохо пахнущий) литой примерный трюк, о котором другие упоминали, чтобы создавать экземпляры любого общего типа, параметризованного анонимным типом для аргумента типа. Однако для List<T> существует несколько менее грубый способ сделать это:

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

Ваш эскиз предлагаемого синтаксиса похож на функцию, которую мы не реализовали для С# 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 в связанной функции), или что-то еще является открытым вопросом.

В любом случае, я бы не задерживал дыхание, ожидая этой функции, если бы я был вами. До сих пор он не сделал разреза на несколько языковых версий, но он останется в списке возможностей на некоторое время, я думаю. Если, предположительно, мы должны были разрабатывать будущие версии языка. Который мы могли бы или не могли бы быть. Помните, что Эрик размышляет о будущих версиях С# только для развлекательных целей.

Ответ 5

Вы не можете создать коллекцию анонимного типа, подобного этому.

Если вам нужно это сделать, вам нужно либо использовать List<object>, либо создать собственный класс или структуру для вашего типа.


Edit:

Я перефразирую это:

Хотя, технически, можно составить список анонимного типа, я бы настоятельно рекомендовал никогда не делать этого. Существует почти всегда лучший подход, так как это просто делает код почти недостижимым. Я настоятельно рекомендую создать собственный тип для хранения ваших значений вместо использования анонимных типов.

Пользовательский тип будет иметь все те же возможности (поскольку анонимные типы определяются компилятором во время компиляции), но будет намного понятнее разработчик, который следует за вами...


И просто чтобы играть, тоже здесь моя запись для "кода, который я бы никогда не хотел использовать в реальном мире":

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

Ответ 6

Здесь подход, который несколько чище, чем многие другие предложения:

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

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

Ответ 7

Я потратил немало времени, пытаясь найти способ сохранить себя некоторое время, используя список анонимных типов, а затем понял, что, скорее всего, быстрее использовать частный класс внутри текущего класса...

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

}

Ответ 8

Я не думаю, что это возможно. Может быть, в С# 4 с использованием динамического ключевого слова?