2009-05-07 36 views
9

Tôi đang cố gắng generics lần đầu tiên và đang gặp một vấn đề.C# danh sách generics của các đối tượng được sử dụng như một tài sản - không thể thêm giá trị

Tôi có một dll đó gửi tin nhắn theo lô

  • có một "Message" lớp và một lớp "hàng loạt" ở chỗ dll

  • trên lớp lô, tôi có một số công cộng tính

  • trên tài sản công cộng lớp hàng loạt là một tài sản gọi là "tin nhắn", đó là một danh sách các lớp "Message" như sau:

    public List<Message> Messages {get;set;} 
    

Phương pháp 1

sau đó tôi có một exe thử nghiệm nơi tôi muốn thiết lập các thuộc tính trên lớp "hàng loạt" như sau:

Batch myBatch = new Batch() 
myBatch.Messages.Add(
    new MyNameSpace.Message(txtToAddress.Text, txtMessage.Text)); 

Khi tôi chạy ứng dụng, Tôi nhận được:

"Tham chiếu đối tượng không được đặt thành phiên bản của đối tượng".

Phương pháp 2

Sau khi chơi xung quanh một chút, tôi thấy rằng tôi có thể làm thành công sau trong exe kiểm tra:

List<MyNameSpace.Message> myMessages = new List<MyNameSpace.Message>(); 
myBatch.Messages.Add(
new MyNameSpace.Message(txtToAddress.Text, txtMessage.Text)); 
myBatch.Messages = myMessages; 

Tôi muốn để có được nó làm việc trong lần đầu tiên bởi vì các lập trình viên khác sẽ sử dụng dll và có vẻ như có nhiều cách để sử dụng cách tiếp cận đầu tiên.

Tôi thiếu gì để có phương pháp đầu tiên hoạt động?

Trả lời

20

Thông thường, các bộ sưu tập được khởi tạo bởi đối tượng phụ huynh:

public List<Message> Messages {get; private set;} 

public Batch() { // constructor 
    Messages = new List<Message>(); 
} 

Bây giờ nó sẽ làm việc như mong đợi. Lưu ý rằng nếu bạn đang sử dụng XmlSerializer bạn sẽ cần phải giữ cho bộ công quá ...

Trong một số cách khác nhau, các mã bất động sản dài tay là dễ dàng hơn ở đây:

private List<Message> messages = new List<Message>(); 
public List<Message> Messages { get {return messages; } } 

(không rối tung với nhà thầu , vv)

2

Trước tiên, bạn cần phải tạo danh sách của mình.

Thêm phần này vào contstructor

Messages = new List<Message>(); 
1
Batch myBatch = new Batch() 
myBatch.Messages.Add(

của bạn Sau khi tạo một new List Messages batchthe có lẽ không tạo được nêu ra. Tạo Danh sách trong hàm tạo của Hàng loạt.

1

Trong constructor của lớp Batch, tạo ra một danh sách cho Messages tài sản:

public Batch() { 
    Messages = new List<Messages>(); 
} 
1

lớp Đợt của bạn sẽ phải chịu trách nhiệm cho việc tạo một thể hiện của danh sách có lẽ là trong các nhà xây dựng sẽ là tốt nhất địa điểm.

Các vấn đề liên quan