2009-10-08 18 views
6

Estoy queriendo saber si hay una manera de inicializar un List<T> donde T es un object de forma similar a como se inicializa una colección simple?Inicializador de objetos para colecciones de objetos

Simple Collection Initializer:

List<int> digits = new List<int> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 

Object Collection Initilizer:

List<ChildObject> childObjects = new List<ChildObject> 
{  
     new ChildObject(){ Name = "Sylvester", Age=8 }, 
     new ChildObject(){ Name = "Whiskers", Age=2 }, 
     new ChildObject(){ Name = "Sasha", Age=14 } 
}; 

La pregunta es, ¿y si se puede hacer algo como esto?

List<ChildObject> childObjects = new List<ChildObject> 
{  
     { "Sylvester", 8} , {"Whiskers", 2}, {"Sasha", 14} 
}; 

Respuesta

1

Puede Haga esto sin crear su propia clase derivada de List<ChildObject> según la respuesta de Lee. Es desafortunado que los métodos de extensión no se consideran para initalizers de recolección, de lo contrario esto funcionaría:

// This doesn't work, but it would if collection initializers checked 
// extension methods. 
using System; 
using System.Collections.Generic; 

public class ChildObject 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

public static class Extensions 
{ 
    public static void Add(this List<ChildObject> children, 
          string name, int age) 
    { 
     children.Add(new ChildObject { Name = name, Age = age }); 
    } 
} 

class Test 
{ 
    static void Main(string[] args) 
    { 
     List<ChildObject> children = new List<ChildObject> 
     { 
      { "Sylvester", 8 }, 
      { "Whiskers", 2 }, 
      { "Sasha", 14 } 
     }; 
    } 
} 
+0

Esto es lo que esperaba. –

0

Lo más cerca que se puede llegar a esto es crear un constructor parametrizado en su clase que acepta esos argumentos. Eso no te llevará hasta el final, pero al menos puede hacer esto:

List<ChildObject> childObjects = new List<ChildObject> 
{  
     new ChildObject("Sylvester", 8) , 
     new ChildObject("Whiskers", 2), 
     new ChildObject("Sasha", 14) 
}; 
3

Si nos fijamos en the docs de inicializadores de colección, es todo acerca de método Add de la colección. Simplemente haga una subclase de la Lista genérica cerrada sobre su tipo y haga un método Add con los parámetros desnudos. Al igual que

public class MyColl : List<ChildObject> 
{ 
    public void Add(string s1, int a1, int a2) 
    { 
     base.Add(new ChildObject(s1, a1, a2)); 
    } 
} 

public class ChildObject 
{ 
    public ChildObject(string s1, int a1, int a2) 
    { 
     //... 
    } 
} 

Entonces llamando a que parece:

static void Main(string[] args) 
    { 
     MyColl x = new MyColl 
     { 
      {"boo", 2, 4}, 
      {"mang", 3, 5}, 
     }; 
    } 
3

Lo mejor que puede hacer probablemente es algo como esto:

public class MyListOfChildObjects : List<ChildObject> 
{ 
    public void Add(string name, int age) 
    { 
     Add (new ChildObject { Name = name, Age = age }); 
    } 
} 

var childObjects = new MyListOfChildObjects 
{ 
    { "Sylvester", 8 } , { "Whiskers", 2 }, { "Sasha", 14 } 
}; 

Usted podría hacerlo más genérico, pero ¿cómo lo ¿Sabes qué argumentos deben estar ligados a cada propiedad?

public class MyList<T> : List<T> 
{ 
    public void Add(params object[] arguments) 
    { 
     // what order should I bind the values to? 
    } 
} 

var childObjects = new MyList<ChildObject> 
{ 
    { "Sylvester", 8 } , { "Whiskers", 2 }, { "Sasha", 14 } 
}; 
+0

Sólo por el bien de la integridad de la respuesta: tener Agregar como método de extensión para la Lista todavía no va a dejar de usar la colección sintaxis del inicializador ya que no compila (Error: "Sin sobrecarga para el método 'Agregar' toma '2' argumentos"). –

3

Puede acercarse mediante la creación de su propia colección que se extiende List<ChildObject> y proporcionar su propio método add:

public class ChildObjectCollection : List<ChildObject> 
{ 
    public void Add(string name, int age) 
    { 
     this.Add(new ChildObject(name, age)); 
    } 
} 

A continuación, puede inicializar así:

var childObjects = new ChildObjectCollection 
{ 
    { "Sylvester", 8} , {"Whiskers", 2}, {"Sasha", 1 } 
}; 
Cuestiones relacionadas