添加到构造函数中的只读集合?

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

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

…在我的代码中…

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

(不是一个很好的例子,但我希望这可以解决这个问题)……

UPDATE

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

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

 var node = new Node { Children = { new Node(), new Node() } }; 

如果你有一个List类型的属性只是get ,这只意味着你不能设置该属性,你仍然可以添加到列表中的东西。

但是,您可以公开IEnumerable属性,并使用一个构造函数来获取列表(或者更可能是另一个IEnumerable )。

属性初始值设定项不起作用,因为编译器只会将它们重写为常规属性赋值。

我这样做:

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

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

 public static Node Create(IEnumerable children) { var n = new Node(); foreach (var c in children) n.Children.Add(c); return n; } 

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

 void Add(Node child) 

因此,这样的课程不能提供你想要的不变性。 我认为解决问题的最佳方法是做到这一点

 public class Node { public readonly IEnumerable Children; public Node(IEnumerable children) { Children = children; } } 

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

 public class Node { public readonly ReadOnlyCollection Children; public Node(IEnumerable children) { Children = new ReadOnlyCollection(children); } } 

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

像这样

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

然后你就可以做到这一点

 var node = new Node((new ObservableList()).Add(new Node()));