2009-05-07 7 views
9

J'essaie les génériques pour la première fois et j'ai un problème.Liste des génériques C# des objets utilisés comme propriété - impossible d'ajouter des valeurs

J'ai une dll qui envoie des messages par lots

  • il y a une classe classe « Message » et un « lot » en ce dll

  • sur la classe de lots, j'ai un peu du public propriétés

  • sur des propriétés publiques de la classe de lot est une propriété appelée « Messages » qui est une liste de la classe « message » comme suit:

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

Méthode 1

J'ai alors un exe de test où je veux définir les propriétés de la classe "Lot" comme suit:

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

Quand je lance l'application, Je reçois:

"La référence d'objet n'est pas définie sur une instance d'un objet."

Méthode 2

Après avoir joué un peu, je vois que je peux faire avec succès ce qui suit dans le test exe:

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

Je voudrais le faire fonctionner dans le premier manière parce que d'autres programmeurs utiliseront la DLL et il semble plus intuitif d'utiliser la première approche.

Qu'est-ce qui me manque pour que la première méthode fonctionne?

Répondre

20

Normalement, les collections sont initialisés par l'objet parent:

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

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

Maintenant, il devrait fonctionner comme prévu. Notez que si vous utilisez XmlSerializer vous aurez besoin de garder l'ensemble du public aussi ...

À certains égards, le code de la propriété à la main longue est plus facile ici:

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

(pas déconner avec les constructeurs , etc)

2

Vous devez d'abord instancier votre liste.

Ajouter à votre contstructor

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

Après avoir créé une nouvelle liste de messages batchthe est probablement pas encore créé. Créez la liste dans le constructeur de Batch.

1

Dans le constructeur de la classe Batch, créer une liste pour la Messages propriété:

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

Votre classe de lots Il faut être responsable de la création d'une instance de la liste probablement dans le constructeur serait le meilleur endroit.