2009-10-08 12 views
6

Chcę się dowiedzieć, czy istnieje sposób na zainicjowanie List<T>, gdzie T jest object podobnie jak inicjalizowana jest prosta kolekcja?Obiekt Inicjator dla kolekcji obiektów

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

Chodzi o to, w jaki sposób i czy można zrobić coś takiego?

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

Odpowiedz

1

Ty możliwe, nie rób tego, tworząc własną klasę wywodzącą się z List<ChildObject> zgodnie z odpowiedzią Lee. To niefortunne, że rozszerzenie metod nie są uważane za initalizers zbiórki, w przeciwnym razie to będzie dział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

Tego właśnie oczekiwałem. –

0

Najbliższym rozwiązaniem jest utworzenie sparametryzowanego konstruktora klasy, który akceptuje te argumenty. Że nie będzie Ci całą drogę, ale można przynajmniej to zrobić:

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

Jeśli spojrzeć na the docs dla inicjalizatorów zbiórki, to wszystko o metody Add kolekcji użytkownika. Po prostu podklasuj zamkniętą listę ogólną nad swoim typem i stwórz metodę dodawania z nagimi parametrami. Jak

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) 
    { 
     //... 
    } 
} 

następnie wywołanie wygląda tak:

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

Najlepszym prawdopodobnie można zrobić coś takiego:

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

Można uczynić go bardziej uniwersalne, ale jak byś wiedzieć, które argumenty powinny być związane z każdą własnością?

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

Właśnie w trosce o kompletność odpowiedź: mając Dodaj jako metodę rozszerzenia do listy nadal nie pozwoli korzystać z kolekcji Składnia inicjalizatora, ponieważ się nie kompiluje (Błąd: "Brak przeciążenia dla metody" Dodaj "powoduje" 2 "argumenty"). –

3

można zbliżyć się tworząc własną kolekcję, która rozciąga List<ChildObject> i dostarczyć własne metody Add:

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

Można wtedy inicjalizacja to tak:

var childObjects = new ChildObjectCollection 
{ 
    { "Sylvester", 8} , {"Whiskers", 2}, {"Sasha", 1 } 
}; 
Powiązane problemy