Declaración de tipos anónimos Lista

¿Hay alguna forma de declarar un objeto de lista de tipo anónimo? quiero decir

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

Esto se debe a que necesito crear una colección en tiempo de ejecución. Gracias por adelantado

Implica un poco de piratería, pero se puede hacer.

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

¿Qué tal dynamic?

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

Puedes hacer una lista como esta, pero nuevamente tendrás que usar hackers serios, y tendrás que usar algunas situaciones de “tipo por ejemplo”. Por ejemplo:

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

En general, puede usar el molde (posiblemente con mal olor) mediante el truco de ejemplo que otros han mencionado para crear instancias de cualquier tipo genérico parametrizado con un tipo anónimo para el argumento de tipo. Sin embargo, para List hay una forma un poco menos bruta de hacerlo:

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

Su bosquejo de una syntax propuesta es similar a una característica que no implementamos para C # 3 o 4, pero consideramos. Llamamos a la función “tipos de murmullo”, y sería algo como esto:

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

Lo llamamos “tipos de murmullo” porque por supuesto lo leería “myList es una nueva lista de hrmmf”. 🙂

La idea es que el comstackdor revise los inicializadores y haga todo lo posible para descubrir cuál podría ser el tipo, del mismo modo que “var” significa “mirar el inicializador y descubrir cuál es el tipo de la variable”. “. Si usamos “var” como el “murmullo” o “?” (que es similar a lo que hace Java en una función relacionada), o algo más es una pregunta abierta.

En cualquier caso, no aguantaría la respiración esperando esta característica si fuera tú. Hasta ahora no ha alcanzado el límite para varias versiones de idiomas, pero creo que permanecerá en la lista de posibilidades durante un tiempo más. Si, hipotéticamente hablando, estuviéramos diseñando versiones futuras del lenguaje. Que podríamos o no ser. Recuerde, las reflexiones de Eric sobre las versiones futuras de C # son solo para fines de entretenimiento.

No puede hacer una colección de un tipo anónimo como este.

Si necesita hacer esto, necesitará usar List , o crear una clase o estructura personalizada para su tipo.


Editar:

Voy a reformular esto:

Aunque, técnicamente, es posible hacer una lista de tipo anónimo, recomiendo encarecidamente que nunca lo haga. Casi siempre hay un enfoque mejor, ya que hacer esto es simplemente crear un código que casi no se puede mantener. Recomiendo hacer un tipo personalizado para mantener sus valores en lugar de usar tipos anónimos.

Un tipo personalizado tendrá todas las mismas capacidades (ya que el comstackdor define los tipos anónimos en el momento de la comstackción), pero será mucho más comprensible para el desarrollador que lo sigue …


Y solo para jugar, esta es mi entrada para un “código que nunca querría usar en el mundo real”:

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

Aquí hay un enfoque que es algo más limpio que muchas de las otras sugerencias:

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

Pasé bastante tiempo intentando encontrar la manera de ahorrar algo de tiempo usando una lista de tipos anónimos, y luego me di cuenta de que probablemente era más rápido usar una clase privada dentro de la clase actual …

 private class Lookup { public int Index; public string DocType; public string Text; } private void MyMethod() { List all_lookups = new List { 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... } 

No creo que esto sea posible. ¿Tal vez en C # 4 usando la palabra clave dinámica?