[英]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
现在可以向调用方公开。 为了允许客户端添加/删除项目,您将实现从内部列表添加/删除的Add
和Remove
成员。
public void Add(Comment comment)
{
/* code */
_comments.Add(comment);
}
public void Remove(Comment comment)
{
/* code */
_comments.Remove(comment);
}
另外,您可以实现自己的 IList
,为您的Add
和Remove
方法提供正确的实现。
您无法限制公开设置的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.