如何在 Class 的列表 属性 中自动填充 属性
How to auto populate a property within a List property of a Class
首先,提前感谢任何可以提供帮助的人。
我有一个 header 和台词场景。我想要 object 到 auto-populate 行以及 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 - 修复 collection 集。
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
collection 时设置。这意味着您可以事后更改它,否则您添加到 Lines
的任何新项目都不会得到更正。
选项 2 - 在构建 Line
时传入 Header
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 的实例直接添加到 collection
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
*/
首先,提前感谢任何可以提供帮助的人。
我有一个 header 和台词场景。我想要 object 到 auto-populate 行以及 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 - 修复 collection 集。
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
collection 时设置。这意味着您可以事后更改它,否则您添加到 Lines
的任何新项目都不会得到更正。
选项 2 - 在构建 Line
时传入 Headerpublic 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 的实例直接添加到 collection
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
*/