如何验证正在添加到集合属性的项目?

Sin*_*tic 0 .net c#

好的,我们有包含属性的类Ticket:

List<TaskComment> Comments;
Run Code Online (Sandbox Code Playgroud)

我设置了back属性,以便我可以做一些验证:

private List<TaskComment> _comments;
public List<TaskComment> Comment
{
   get
   { //stuff }
   internal set
   { //stuff }
}
Run Code Online (Sandbox Code Playgroud)

尽管将set设置为internal,但Add()方法仍然在程序集外部公开.但无论如何,我想要做的是设置评论对象的ticketId属性,因为它被添加到集合中.例如:

var ticket = new TaskTicket();
var comment = new TaskComment { //initializers }
ticket.Comments.Add(comment);

--inside the ticket:
public List<TaskComment> Comments
{
   get{ //stuff }
   set
   {
      ((TaskComment)value).TicketId = this._ticketId;
   }
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用.它告诉我它无法从TaskComment转换为MyLibrary.TaskComment.这对我来说真的没有任何意义.但除此之外,无论如何,这感觉不对.那么在将传入的值/对象添加到类的集合之前,我究竟该如何修改它?

xan*_*ded 5

Collection以只读方式公开:

public IReadOnlyCollection<TaskComment> Comments
{
   get { return new ReadOnlyCollection(_comments); }
}
Run Code Online (Sandbox Code Playgroud)

_comments现在使用先前的实现向调用者公开.允许客户端添加/删除您实现的项目Add以及Remove从内部列表添加\ remove的成员.

public void Add(Comment comment)
{
    /* code */
    _comments.Add(comment);
}

public void Remove(Comment comment)
{
    /* code */
    _comments.Remove(comment);
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以实现自己 IList的方法,为您AddRemove方法提供正确的实现.