2009-10-08 74 views
6

我想知道是否有方法來初始化List<T>其中Tobject很像簡單的集合初始化?對象集合的對象初始化器

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

的問題是,怎樣,如果你可以做這樣的事情?

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

回答

1

你可以根據Lee的回答,如果沒有創建自己的類別List<ChildObject>,就不要這樣做。這是不幸的擴展方法不被視爲收集initalizers,否則這會工作:

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

這就是我所希望的。 – 2009-10-19 18:43:17

0

你可以到最接近的是創建一個接受這些觀點對你類參數的構造函數。這不會讓你一路走好,但你至少可以做到這一點:

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

如果你看一下the docs爲集合初始化,它是所有關於集合的Add方法。只需在您的類型上繼承關閉的泛型List並使用裸參數創建Add方法。像

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

然後調用它看起來像:

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

你大概可以做的最好的是這樣的:

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

你可以使它更通用的,但你會如何知道哪些參數應該綁定到每個屬性?

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

只是爲了回答的完整性的考慮:具有添加爲擴展方法列表仍然不會讓使用集合初始化語法,因爲它不會編譯(錯誤:「方法沒有超載'添加'需要'2'參數」)。 – 2009-10-08 19:14:26

3

您可以通過創建自己的集合延伸List<ChildObject>親近,並提供自己的加入方法:

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

然後,您可以初始化它像這樣:

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