C# generics список объектов, используемых в качестве свойства - нельзя добавлять значения

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

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

  • в этой dll есть класс "Сообщение" и класс "Пакетный"

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

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

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

Способ 1

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

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, и первый подход кажется более интуитивным.

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


person Nils    schedule 07.05.2009    source источник


Ответы (5)


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

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; } }

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

person Marc Gravell    schedule 07.05.2009

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

Добавьте это в свой конструктор

Messages = new List<Message>();
person Eoin Campbell    schedule 07.05.2009

Batch myBatch = new Batch()
myBatch.Messages.Add(

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

person RvdK    schedule 07.05.2009

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

public Batch() {
   Messages = new List<Messages>();
}
person Guffa    schedule 07.05.2009

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

person Tim Jarvis    schedule 07.05.2009