2009-10-08 39 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 } 
};