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

时间:2011-11-19 18:09:24

标签: c#

如何设置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);
    }

}

4 个答案:

答案 0 :(得分:22)

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

有几个选择:

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

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

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。