在C#中,有没有办法为新数据类型编写自定义对象初始值设定项?

在C#中,有“标准”初始化技术{Property1 =“a”,Property2 =“b”},并且有一些特殊的集合变体(列表和字典)。 {value1,value2}和{{“key1”,value1},{“key2”,value2}}。

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

我是通过构造函数来做的,但我想要一个更简洁的语法。

如果您实现了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(){} } 

使用一个简单调用构造函数的可变局部lambda n ,你可以得到它的简短:

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

更新:类似的东西

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

如果您的树的节点很容易构造,即可以从它们的值初始化,那么您可以通过添加额外的方法使事情比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" } };