0

わかりました、プロパティを含むクラス Ticket があります。

List<TaskComment> Comments;

いくつかの検証を行うことができるように、 back プロパティを設定しました。

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 にキャストできないと言っています。これは本当に意味がありません。しかし、それ以外に、これはとにかく正しくありません。では、クラスのコレクションに追加する前に、受信した値/オブジェクトを正確に変更するにはどうすればよいでしょうか?

4

4 に答える 4

5

を読み取り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);
}

または、メソッドとメソッドに適切な実装を提供する独自のものを実装する こともできます。IListAddRemove

于 2012-07-16T18:28:33.003 に答える
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() メソッドをオーバーロードして、コメントを Comment コレクションに追加することもできます。

于 2012-07-16T18:36:09.353 に答える
0

プライベート フィールドをリストとして保持しますが、読み取り専用で IEnumerable になるようにプロパティを変更します。次に、他の人が示唆しているように、プライベートフィールドにアクセスする特定の Add メソッドを実装します。このようにして、呼び出し元はコレクションを自由に反復できますが、add メソッドを使用してコレクションに追加する必要があり、検証などの場所を提供して、例外をスローしたり、成功コードを返したりすることができます。

具体的なコレクション型を返すと、将来の変更に対する選択肢が制限されます。一方、インターフェイスを返すと、呼び出し元に影響を与えることなく、基になるコレクションを変更できます。

List が暗黙の IEnumerable サポートを持っている場合、ReadOnlyCollection を新しくするのは無駄に思えます。

于 2012-07-16T19:59:50.390 に答える
0

公開クラスを制限する方法はありませんList<T>。あなたのアプリでのポネシャルをあまり使わないのであれば、List<T>そのリストをラップすることをお勧めします。

言う:

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

    taskComments.Add(task);
}

getプロパティから public acesorを削除するCommentsか、プロパティ全体を削除します (*可能な場合)

于 2012-07-16T18:30:23.790 に答える