繁体   English   中英

如何验证要添加到集合属性中的项目?

[英]How do I validate an item that is being Added to property that is a collection?

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

List<TaskComment> Comments;

我将其设置为back属性,以便可以进行一些验证:

private List<TaskComment> _comments;
public List<TaskComment> Comment
{
   get
   { //stuff }
   internal set
   { //stuff }
}

尽管将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;
   }
}

但这是行不通的。 告诉我它不能从TaskComment投射到MyLibrary.TaskComment。 这对我来说真的没有任何意义。 但是除此之外,这仍然感觉不对。 那么,在将输入值/对象添加到类的集合中之前,我该如何精确地修改它呢?

Collection公开为只读:

public IReadOnlyCollection<TaskComment> Comments
{
   get { return new ReadOnlyCollection(_comments); }
}

使用先前的实现_comments现在可以向调用方公开。 为了允许客户端添加/删除项目,您将实现从内部列表添加/删除的AddRemove成员。

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

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

另外,您可以实现自己的 IList ,为您的AddRemove方法提供正确的实现。

您无法限制公开设置的List<T>类。 如果您在应用程序中使用的List<T>的词性过多,我建议只包装该列表。

说:

pulbic void AddComment(TaskComment task)
{
    /*Some validation on task parameter*/

    taskComments.Add(task);
}

并从Comments属性或整个属性本身中删除public get acessor(*, 如果可能的话)

设置器中的value对象将为List类型,因此当将其强制转换为TaskComment类型时,它将引发错误。 在您的代码中,您可以做

var comment = new TaskComment { //initializers } 
comment.TicketId = ticket.TicketId; //where TicketId is a public property for _ticketId
ticket.Comments.Add(comment); 

或者您可以重载Add()方法以将注释添加到Comment集合中

将私有字段保留为列表,但是更改您的属性,使其为只读且IEnumerable。 然后,如其他人所建议的那样,实现访问私有字段的特定Add方法。 这样,您的调用者可以自由地遍历集合,但是必须使用add方法添加到集合中,从而为您提供了一个进行验证的地方,等等,并引发异常或返回成功代码。

返回具体的收集类型会限制您将来更改的选择。 而返回接口使您可以更改基础集合,而不会影响调用者。

当List具有隐式IEnumerable支持时,更新ReadOnlyCollection似乎很浪费。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM