1

是否有 ac# 语言构造允许我将项目添加到构造函数中的只读集合属性?我想做这样的事情:

public class Node{
    public IList<Node> Children {get; protected set;}
    public Node(){
        Children = new ObservableList<Node>();
    }
}

...在我的代码某处...

var node = new Node {Children.Add(new Node())};

(不是一个很好的例子,但我希望这能让你明白)......

更新

好的,对不起,我需要更清楚。我没有写这Node门课,我不能改变它。我在问是否有 ac# 语言概念允许我添加到第二个片段的无参数构造函数中的只读集合中,假设Node类不可更改。

4

4 回答 4

4

试试这个。绝对可以在构造上添加元素

var node = new Node
 {
     Children =
    {
        new Node(),
        new Node()
    }
 };
于 2013-10-10T19:32:19.760 回答
0

如果您有一个 List 类型的属性get,那只是意味着您无法设置该属性,您仍然可以将内容添加到列表中。

但是,您可以改为公开一个IEnumerable属性并拥有一个采用列表(或IEnumerable更可能是另一个)的构造函数。

属性初始化器不起作用,因为编译器只会将它们重写为常规属性分配。

我会这样做:

public class Node{
    public IEnumerable<Node> Children {get; private set;}
    public Node(IEnumerable<Node> children){
        Children = children.ToList();
    }
}

如果你不能改变Node类,我建议写一个类似这样的帮助类:

public static Node Create(IEnumerable<Node> children)
{
    var n = new Node();
    foreach (var c in children)
        n.Children.Add(c);
     return n;
}
于 2013-10-10T19:23:13.970 回答
0

要使用第二个代码片段中的集合初始化器语法,您的 Node 类必须实现 IEnumerable 并具有带有签名的公共方法

void Add(Node child)

因此,这样的类不能提供您想要的不变性。我认为解决您的问题的最佳方法是这样做

public class Node
{
  public readonly IEnumerable<Node> Children;

  public Node(IEnumerable<Node> children)
  {
    Children = children;
  }
}

或者如果您不喜欢 IEnumerable 的延迟执行:

public class Node
{
  public readonly ReadOnlyCollection<Node> Children;

  public Node(IEnumerable<Node> children)
  {
    Children = new ReadOnlyCollection<Node>(children);
  }
}
于 2013-10-10T19:39:44.300 回答
-1

您可以向“Children”属性添加一个支持字段,然后在构建期间填充支持字段。

像这样

public class Node
        {
            private IList<Node> _Children;
            public IList<Node> Children { get { return _Children; } }
            public Node(IList<Node> children)
            {
                _Children = children;
            }
        }

然后你可以这样做

var node = new Node((new ObservableList<Node>()).Add(new Node()));
于 2013-10-10T19:25:24.890 回答