如何在类的List属性中自动填充属性

时间:2017-09-15 21:48:59

标签: c# accessor class-properties

首先,提前感谢任何可以提供帮助的人。

我有标题和行方案。我希望lines对象能够使用Header中的headerId自动填充。请有人帮忙吗?

public class Header
{
    public int headerId { get; set; }
    public List<Lines> lines { get; set; }
}

public class Lines
{
    public int lineId { get; set; }
    public int headerId { get; set; }   //<<< want to autopopulate this from Header object
}

2 个答案:

答案 0 :(得分:1)

有很多方法可以做到这一点。

选项1 - 修复集合集。

if($(this).val() && $(this).val() == 'AM')

此路由的问题是仅在设置public class Header { private List<Lines> _lines public int HeaderId { get; set; } public List<Line> Lines { get { return _lines; } set { _lines = value; if(_lines != null) { foreach(var line in _lines) line.HeaderId = HeaderId; } } } } public class Line { public int LineId { get; set; } public int HeaderId { get; set; } } 集合时才设置HeaderId。这意味着您可以在事实之后更改它,或者添加到Lines的任何新项目都不会得到纠正。

选项2 - 在构造线

时传入标题
Lines

只要您对所有行都有相同的public class Header { public int HeaderId { get; set; } public List<Line> Lines { get; set; } } public class Line { public Header ParentHeader { get; } public int LineId { get; set; } public int? HeaderId { get { return ParentHeader?.HeaderId; } public Line(Header header) { ParentHeader = header; } } 个实例,如果您更改Header,所有行都会自动更新。

选项3 - 不要将Line的实例直接添加到集合

Header.HeaderId

这与选项1具有相同的问题。

答案 1 :(得分:0)

你可以这样做......

public class Header
{
    static int _headerIdSeed = 0;

    public int HeaderId { get; internal set; } = _headerIdSeed++;
    public IList<Line> Lines { get; } = new List<Line>();

    public Header Add(Line line)
    {
        line.HeaderId = this.HeaderId;
        this.Lines.Add(line);
        return this;
    }

    public Header Add(params Line[] lines)
    {
        return this.AddRange(lines);
    }

    public Header AddRange(IEnumerable<Line> lines)
    {
        foreach (var line in lines)
        {
            line.HeaderId = this.HeaderId;
            this.Lines.Add(line);
        }
        return this;
    }
}

public class Line
{
    static int _lineIdSeed = 0;
    public int LineId { get; internal set; } = _lineIdSeed++;
    public int HeaderId { get; internal set; }
}

......你可以像这样使用它......

var header = new Header
{
    HeaderId = 1,
}.Add(new Line { },
      new Line { },
      new Line { });

foreach (var line in header.Lines)
    Console.WriteLine($"{line.HeaderId}-{line.LineId}");
/*
1-0
1-1
1-2
*/