C#获取并设置List Collection的属性

Collection的属性如何设置?

我创建了一个带有Collection属性的类。 我想在设置新值时随时添加到List中。 在set方法中使用_name.Add(value)不起作用。

Section newSec = new Section(); newSec.subHead.Add("test string"); newSec.subHead.Add("another test string"); public class Section { public String head { get; set; } private List _subHead = new List(); private List _content = new List(); public List subHead { get { return _subHead; } set { _subHead.Add(value); } } public List content { get { return _content; } set { _content.Add(value); } } } 

用我的解决方案更新:

 public class Section { private List _head = new List(); private List _subHead = new List(); private List _content = new List(); public List Head { get { return _head; } } public List SubHead { get { return _subHead; } } public List Content { get { return _content; } } public void AddHeading(string line) { Head.Add(line); } public void AddSubHeading(string line) { SubHead.Add(line); } public void AddContent(string line) { Content.Add(line); } } 

将它作为setter的一部分是不合适的 – 它不像你真正设置整个字符串列表 – 你只是想添加一个。

有几个选择:

  • 在类中放置AddSubheadingAddContent方法,并且只显示列表的只读版本
  • 仅使用getter公开可变列表,并让调用者添加它们
  • 放弃所有封装的希望,只需使它们具有读/写属性

在第二种情况下,您的代码可以只是:

 public class Section { public String Head { get; set; } private readonly List _subHead = new List(); private readonly List _content = new List(); // Note: fix to case to conform with .NET naming conventions public IList SubHead { get { return _subHead; } } public IList Content { get { return _content; } } } 

这是一个相当实用的代码,虽然它确实意味着调用者可以以他们想要的方式改变你的集合,这可能并不理想。 第一种方法保持最大的控制权(只有你的代码才能看到可变列表)但对调用者来说可能不那么方便。

使集合类型的setter实际上只是将一个元素添加到现有集合既不可行也不愉快,所以我建议你放弃这个想法。

如果我理解您的请求,您必须执行以下操作:

 public class Section { public String Head { get { return SubHead.LastOrDefault(); } set { SubHead.Add(value); } public List SubHead { get; private set; } public List Content { get; private set; } } 

你这样使用它:

 var section = new Section(); section.Head = "Test string"; 

现在,“测试字符串”被添加到subHeads集合中,并将通过getter提供:

 var last = section.Head; // last will be "Test string" 

希望我理解正确。

要么

 public class Section { public String Head { get; set; } private readonly List _subHead = new List(); private readonly List _content = new List(); public IEnumerable SubHead { get { return _subHead; } } public IEnumerable Content { get { return _content; } } public void AddContent(String argValue) { _content.Add(argValue); } public void AddSubHeader(String argValue) { _subHead.Add(argValue); } } 

全部取决于您要隐藏的内容和子标题的实现程度。

你的安装人员很奇怪,这就是你可能会遇到问题的原因。

首先,考虑一下你是否需要这些setter – 如果是这样,他们应该采用List ,而不仅仅是一个string

 set { _subHead = value; } 

这些线:

 newSec.subHead.Add("test string"); 

调用getter然后在返回的List上调用Add – 不调用setter。