C # обобщенный список объектов, используемых как свойство - не может добавлять значения - PullRequest
9 голосов
/ 07 мая 2009

Я впервые пробую дженерики, и у меня возникла проблема.

У меня есть DLL, которая отправляет сообщения в пакетном режиме

  • есть класс "Message" и класс "Batch" в этой dll

  • в классе пакета, у меня есть некоторые общедоступные свойства

  • одним из общедоступных свойств класса пакета является свойство «Messages», которое представляет собой список класса «Message» следующим образом:

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

Метод 1

Затем у меня есть тестовый exe-файл, в котором я хочу установить свойства класса "Batch" следующим образом:

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

Когда я запускаю приложение, я получаю:

"Ссылка на объект не установлена ​​для экземпляра объекта."

Метод 2

Немного поиграв, я вижу, что могу успешно выполнить следующее в тестовом exe:

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

Я бы хотел, чтобы это работало в первую очередь, потому что другие программисты будут использовать dll, и кажется более интуитивным использовать первый подход.

Чего мне не хватает, чтобы заставить работать первый метод?

Ответы [ 5 ]

20 голосов
/ 07 мая 2009

Обычно коллекции инициализируются родительским объектом:

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

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

Теперь все должно работать как положено. Обратите внимание, что если вы используете XmlSerializer, вам также нужно сохранить публичный набор ...

В некотором смысле, код свойства длинной руки здесь проще:

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

(не надо возиться с конструкторами и т. Д.)

2 голосов
/ 07 мая 2009

Сначала вам нужно создать экземпляр вашего списка.

Добавьте это к вашему consttructor

Messages = new List<Message>();
1 голос
/ 07 мая 2009

Ваш пакетный класс должен отвечать за создание экземпляра List, вероятно, в конструкторе будет лучшее место.

1 голос
/ 07 мая 2009

В конструкторе класса Batch создайте список для свойства Messages:

public Batch() {
   Messages = new List<Messages>();
}
1 голос
/ 07 мая 2009
Batch myBatch = new Batch()
myBatch.Messages.Add(

После создания нового пакета список сообщений, вероятно, еще не создан. Создайте список в конструкторе Batch.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...