2012-07-16 67 views
0

好吧,我們有一流的門票包含一個屬性:如何驗證正在添加到作爲集合的屬性的項目?

List<TaskComment> Comments; 

我有它設置了一個背部屬性,這樣我可以做一些驗證:

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

儘管設置的設置來內部,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。這對我來說真的沒有任何意義。但是,除此之外,這不正確。那麼,在將其添加到類的集合之前,我怎麼修改傳入的值/對象呢?

+0

你是否打算爲你的列表添加一個項目?因爲這不是什麼'集' – 2012-07-16 18:29:25

+0

對,我明白,setter是什麼讓我設置完整的集合在一次去 – Sinaesthetic 2012-07-16 19:18:48

回答

5

揭露Collection爲只讀:

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

使用以前的實現_comments現在暴露給調用者。要允許客戶端添加/刪除項目,您需要實施AddRemove成員,這些成員從內部列表中添加\ remove。

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

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

或者,你可以implement your ownIList提供恰當的實現你的AddRemove方法。

+0

好吧換句話說,我禁用公共setter,然後創建公共方法添加評論。然後在那裏處理我的生意? – Sinaesthetic 2012-07-16 19:22:00

+0

@Sinaesthetic不會禁用,只能通過「添加(...)」和「刪除(...)」來添加/刪除。 – xandercoded 2012-07-16 19:23:21

+0

明白了吧。謝謝 – Sinaesthetic 2012-07-16 21:32:43

0

有沒有辦法可以限制 pubblicly esposed List<T>類。 如果您不太在應用中使用List<T>的精華,我會建議只包裝該列表。

說:

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

    taskComments.Add(task); 
} 

並從Comments屬性public get acessor,或整個房地產本身(* 如果這是可能的)

0

在二傳手的值對象將是類型爲List的類型,因此當您將其轉換爲鍵入TaskComment時,它將引發錯誤。在你的代碼可能只是做

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

或者你可以重載Add()方法的註釋添加到註釋集合

0

保持私有字段列表,但改變你的屬性,因此,它的只讀,並且是IEnumerable。然後像其他人所建議的那樣實施特定的Add方法,以訪問專用字段。這樣你的調用者可以自由地遍歷集合,但必須使用add方法添加到它,給你一個地方來驗證等,並拋出異常或返回一個成功的代碼。

返回具體收集類型限制了您未來更改的選項。然而,返回一個接口允許你改變底層的集合而不會影響調用者。

當列表具有隱式IEnumerable支持時,新建ReadOnlyCollection看起來很浪費。

相關問題