2009-05-07 7 views
9

Sto provando i generici per la prima volta e sto avendo un problema.C# lista di oggetti generici di oggetti usati come proprietà - non è possibile aggiungere valori

Ho una dll che invia messaggi in lotti

  • v'è una classe "Messaggio" e una classe "batch" in quella dll

  • sulla classe batch, ho un po 'pubblica proprietà

  • sulla proprietà pubbliche della classe lotto è una proprietà chiamata "Messaggi", che è una lista della classe "Messaggio" come segue:

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

Metodo 1

Ho poi ho un exe di prova dove voglio impostare le proprietà della classe "batch" come segue:

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

Quando eseguo l'applicazione, Ottengo:

"Riferimento oggetto non impostato su un'istanza di un oggetto."

Metodo 2

Dopo aver giocato un po 'intorno, vedo che posso fare con successo quanto segue nel exe di prova:

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

mi piacerebbe farlo funzionare nel primo modo perché altri programmatori useranno la DLL e sembra più intuitivo utilizzare il primo approccio.

Cosa mi manca per far funzionare il primo metodo?

risposta

20

Normalmente, le collezioni vengono inizializzati per l'oggetto padre:

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

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

ora, dovrebbe funzionare come previsto. Si noti che se si sta utilizzando XmlSerializer avrete bisogno di mantenere invariato il record pubblico troppo ...

In un certo senso, il codice di proprietà di lunga mano è più facile qui:

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

(senza scherzi con i costruttori , ecc.)

2

È necessario prima istanziare l'elenco.

aggiungere questo alla tua funzione di costruzione

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

Dopo la creazione di un nuovo elenco batchthe messaggi è probabilmente non ancora creato. Crea la lista nel costruttore di Batch.

1

Nel costruttore della classe Batch, creare una lista per la proprietà Messages:

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

La classe batch avrebbe dovuto essere responsabile della creazione di un'istanza della lista probabilmente nel costruttore sarebbe la migliore posto.