2009-11-16 58 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" } }; 
相關問題