2009-11-16 66 views
7

在C#中,存在“标准”初始化方法{Property1 =“a”,Property2 =“b”},并且存在一些用于集合(列表和字典)的特殊变体。 {value1,value2}和{{“key1”,value1},{“key2”,value2}}。在C#中,有没有办法为新数据类型编写自定义对象初始值设定项?

我想有一个树型数据类型的递归对象初始值设定项,但我不知道是否有任何方法来定制该机制。我想要一些看起来像s表达式的东西。 {item1 {item2 item3 item4} {item5 item6}}

我这样做是通过构造函数,但我想要一个terser语法。

回答

11

如果要实现 ICollection的 的IEnumerable接口并有一个称为add的方法。顺便说一下,这全部包含在ICollection界面中,这就是为什么我混淆它。

Test test = new Test() { 
    new Test2() { 
     new Test3() { 

     } 
    }, 
    new Test() { 
     new Test2() { 
      { new Test(), new Test2() }, 
      { new Test(), new Test2() }, 
      { new Test(), new Test2() } 
     } 
    } 
}; 

public class Test : IEnumerable 
{ 
    public void Add(Test a){} 
    public void Add(Test2 a){} 
    public IEnumerator GetEnumerator(){} 
} 

public class Test2 : IEnumerable 
{ 
    public void Add(Test a, Test2 b){} 
    public void Add(Test3 a){} 
    public IEnumerator GetEnumerator(){} 
} 

public class Test3 : IEnumerable 
{ 
    public void Add(Test a) {} 
    public void Add(Test2 a){} 
    public IEnumerator GetEnumerator(){} 
} 
+1

你不需要实现ICollection - 只是IEnumerable – 2009-11-16 21:43:09

+0

这不像我想象的那么简洁,但它看起来就像你可以得到的一样接近,看起来像这样的答案是,你不能真正定制了对象初始化机制,但是您可以搭载IEnumerable内置的初始化支持。 – darthtrevino 2009-11-17 00:27:50

+0

找到一篇博客文章讨论这个http://resharper.blogspot.com/2 007/09/c-30-collection-initializers-incomplete.html – darthtrevino 2009-11-17 00:36:13

4

使用variadic本地拉姆达n简单地调用构造函数,你可以得到它的短:

n(item1, n(item2, item3, item4), n(item5, item6)) 

更新:像

var n = (params Node[] nodes) => new Node(nodes); 
+2

为什么不直接说params?这是一个C#问题。 – ChaosPandion 2009-11-16 21:36:05

+0

快速回复!这是一个非常有趣的解决方案,但是需要在执行初始化时定义lambda。 此外,它会要求所有可变参数都是项目或项目树,不能混合使用(例如n(item1,n(item2,item3),item4)将不可能。 – darthtrevino 2009-11-16 21:37:02

+0

您可以定义lambda如果你的树项目本身不是节点,你可以修改lambda接受一个普通的'object []',并对它做一些魔术。 – Thomas 2009-11-16 21:41:59

1

如果树的节点是容易构造,即可以从他们的值进行初始化,那么你可以做的事情比ChaosPandion的回答更简洁,通过增加一个额外的方法:

class Tree : IEnumerable 
{ 
    public string Value { get; set; } 

    public void Add(Tree t) { ... } 

    // Add this method 
    public void Add(string s) 
    { 
     Add(new Tree { Value = s }); 
    } 

    public IEnumerator GetEnumerator() { ... } 
} 

所以:

{ item1 { item2 item3 item4 } { item5 item6 } } 

变为:

new Tree { "item1", new Tree { "item2", "item3", "item4" }, new Tree { "item5", "item6" } }; 
相关问题