簡體   English   中英

如何在類的List屬性中自動填充屬性

[英]How to auto populate a property within a List property of a Class

首先,預先感謝任何可以提供幫助的人。

我有一個標題和行的情況。 我希望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
}

您可以通過多種方式來執行此操作。

選項1-修復收藏集。

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; }  
}

此路由的問題在於,僅在設置Lines集合時才設置HeaderId。 這意味着您可以在事實或添加到“ Lines任何新項目不被更正后進行更改。

選項2-構造行時傳入標題

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實例,如果更改了Header.HeaderId所有行均將自動更新。

選項3-不要將Line的實例直接添加到集合中

public class Header
{
    List<Line> _lines = new List<Line>();

    public int HeaderId { get; set; }
    public ReadOnlyCollection<Line> Lines { get {return _lines.AsReadOnly(); }


    public void AddLine(Line line)
    {               
        line.HeaderId = HeaderId;
        _lines.Add(line);
    }
}

這將具有與選項1相同的問題。

你可以做這樣的事情...

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
*/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM