如何设置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<string> _subHead = new List<string>();
private List<string> _content = new List<string>();
public List<string> subHead
{
get
{ return _subHead; }
set
{
_subHead.Add(value);
}
}
public List<string> content
{
get
{ return _content; }
set
{
_content.Add(value);
}
}
}
使用我的解决方案进行更新:
public class Section
{
private List<string> _head = new List<string>();
private List<string> _subHead = new List<string>();
private List<string> _content = new List<string>();
public List<string> Head
{
get
{ return _head; }
}
public List<string> SubHead
{
get
{ return _subHead; }
}
public List<string> 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);
}
}
答案 0 :(得分:22)
它不适合成为setter的一部分 - 它不像你真的设置整个字符串列表 - 你只是想添加一。
有几个选择:
AddSubheading
和AddContent
方法,并且只展示列表的只读版本在第二种情况下,您的代码可以只是:
public class Section
{
public String Head { get; set; }
private readonly List<string> _subHead = new List<string>();
private readonly List<string> _content = new List<string>();
// Note: fix to case to conform with .NET naming conventions
public IList<string> SubHead { get { return _subHead; } }
public IList<string> Content { get { return _content; } }
}
这是一个相当实用的代码,虽然它 意味着调用者可以以他们想要的方式改变你的集合,这可能并不理想。第一种方法保持最大的控制权(只有你的代码才能看到可变列表),但对于调用者来说可能不那么方便。
使集合类型的setter实际上只是将一个元素添加到现有集合既不可行也不愉快,所以我建议你放弃这个想法。
答案 1 :(得分:4)
如果我理解您的要求,您必须执行以下操作:
public class Section
{
public String Head
{
get
{
return SubHead.LastOrDefault();
}
set
{
SubHead.Add(value);
}
public List<string> SubHead { get; private set; }
public List<string> Content { get; private set; }
}
你这样使用它:
var section = new Section();
section.Head = "Test string";
现在,“测试字符串”被添加到subHeads集合中,并将通过getter提供:
var last = section.Head; // last will be "Test string"
希望我理解正确。
答案 2 :(得分:3)
或者
public class Section
{
public String Head { get; set; }
private readonly List<string> _subHead = new List<string>();
private readonly List<string> _content = new List<string>();
public IEnumerable<string> SubHead { get { return _subHead; } }
public IEnumerable<string> Content { get { return _content; } }
public void AddContent(String argValue)
{
_content.Add(argValue);
}
public void AddSubHeader(String argValue)
{
_subHead.Add(argValue);
}
}
全部取决于您要隐藏的内容和子标题的实施程度。
答案 3 :(得分:0)
你的安装人员很奇怪,这就是你可能会遇到问题的原因。
首先,考虑一下您是否需要这些制定者 - 如果是这样,他们应该选择List<string>
,而不仅仅是string
:
set
{
_subHead = value;
}
这些行:
newSec.subHead.Add("test string");
调用getter然后在返回的Add
上调用List<string>
- 不调用setter。