In C#, is there a way to write custom object initializers for new data-types?

前端 未结 3 1364
孤独总比滥情好
孤独总比滥情好 2021-02-09 08:43

In C#, there\'s the \"standard\" initializer technique { Property1 = \"a\", Property2 = \"b\" }, and there are a couple of special variants for collections (list and dictionary)

相关标签:
3条回答
  • 2021-02-09 09:23

    If you implement the ICollection IEnumerable interface and have a method called add. Incidentally, this is all included in the ICollection interface which is why I confused it.

    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(){}
    }
    
    0 讨论(0)
  • 2021-02-09 09:24

    Using a variadic local lambda n that simply calls your constructor, you could get it as short as:

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

    Update: something like

    var n = (params Node[] nodes) => new Node(nodes);
    
    0 讨论(0)
  • 2021-02-09 09:32

    If the nodes of your tree are easy to construct, i.e. can be initialized from their value, then you can make things terser than ChaosPandion's answer, by adding an extra method:

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

    So:

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

    Becomes:

    new Tree { "item1", new Tree { "item2", "item3", "item4" }, new Tree { "item5", "item6" } };
    
    0 讨论(0)
提交回复
热议问题