2009-05-07 15 views
9

Estoy probando genéricos por primera vez y estoy teniendo un problema.C# lista de genéricos de los objetos utilizados como una propiedad - no se pueden agregar valores

que tienen un DLL que envía mensajes en lotes

  • hay una clase "mensaje" y una clase de "lotes" en esa DLL

  • en la clase de lote, tengo algunos públicos propiedades

  • en las propiedades públicas de la clase de lote es una propiedad llamada "Mensajes" que es una lista de la clase "mensaje" de la siguiente manera:

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

Método 1

entonces tengo un exe prueba donde quiero establecer las propiedades de la clase de "lotes" de la siguiente manera:

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

Cuando ejecuto la aplicación, Obtengo:

"Referencia de objeto no establecida en una instancia de un objeto."

Método 2

Después de jugar un poco, veo que puedo hacer con éxito el siguiente en el exe prueba:

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

me gustaría para que funcione en el primer porque otros programadores usarán el dll y parece más intutivo usar el primer enfoque.

¿Qué me falta para obtener el primer método para trabajar?

Respuesta

20

Normalmente, las colecciones se inicializan por el objeto padre:

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

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

Ahora debería funcionar como se espera. Tenga en cuenta que si está utilizando XmlSerializer que necesita para mantener el conjunto público también ...

En cierto modo, el código de la propiedad a largo mano es más fácil aquí:

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

(sin ensuciar con constructores , etc.)

2

Primero debe crear una instancia de su lista.

Agregar a su contstructor

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

Después de crear una nueva lista de mensajes batchthe probablemente no se crea todavía. Crea la lista en el constructor de Batch.

1

En el constructor de la clase Batch, crear una lista para la propiedad Messages:

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

Su clase de lote tendría que ser responsable de crear una instancia de la lista, probablemente, en el constructor sería la mejor lugar.

Cuestiones relacionadas