2015-05-12 4 views
0

У меня есть вложенную коллекция в стороне объекта:Как мне добавить коллекцию объектов в коллекцию объектов?

public class Question 
{ 
    public AnswerObjectCollection Answers 
    { 
     get; 
     private set; 
    } 
} 

Когда я пытаюсь добавить ответы на AnswerObjectCollection в Question объекта я получаю следующее исключение:

объекта не задана ссылка на экземпляр объекта

Question currQuestion = new Question(); 
currQuestion.Answers.AddRange(GetAnswersByQuestion(currQuestion.QuestionIdentity)); 

Если я пытаюсь создать объект ответа п рвые (что работа) я не могу добавить, что либо

AnswerObjectCollection answer = new AnswerObjectCollection(); 
answer.AddRange(GetAnswersByQuestion(currQuestion.QuestionIdentity)); 
currQuestion.Answers.AddRange(answer); 

Если я пытаюсь отображения объектов я не получаю сообщение об ошибке, но переменная currQuestion.Answers является нулевым

Mapper.CreateMap(typeof(AnswerObjectCollection), typeof(AnswerObjectCollection)); 
Mapper.CreateMap(typeof(Answer), typeof(Answer)); 
Mapper.Map(answer, currQuestion.Answers); 
+0

Пожалуйста, отметьте ответ как решение, если кто-то помог вам решить вашу проблему. – cramopy

+0

Почти все случаи «NullReferenceException» одинаковы. См. «[Что такое исключение NullReferenceException и как его исправить?] (Http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-in-net)» для некоторых советов. –

ответ

0

Вы должны добавить конструктор для вашего Question класса

public class Question { 
    public Question() { 
     Answers = new AnswerObjectCollection(); 
    } 
    public AnswerObjectCollection Answers { 
     get; 
     private set; 
    } 
} 

Это будет создать экземпляр Answers собственности.

+0

Обратите внимание, что конструктор не всегда вызывается, например, при десериализации объекта с использованием некоторых сериализаторов структуры. –

+0

@EricJ. Я думаю, если вы укажете конструктор без параметров, он будет вызываться при создании экземпляра экземпляра. Мне нужно проверить tho;) – rae1

+0

@EricJ: Я много десериализовал, и раньше я не сталкивался с проблемой. Но, может быть, мне просто повезло :). Пойду по этому поводу. Спасибо, что указал на возможную проблему. – Ulric

0

Легко, как это:

После создания Question по телефону

Question currQuestion = new Question(); 

вы должны создать экземпляр AnswerObjectCollection

currQuestion.Answers = new AnswerObjectCollection(); 

и он будет работать.

Или добавьте в ваш код:

public Question() 
{ 
    Answers = new AnswerObjectCollection(); 
} 
+0

Обратите внимание, что конструктор не всегда вызывается, например, при десериализации объекта с использованием некоторых сериализаторов структуры. –

+0

@EricJ. это правда, но я думаю, что это может быть нормально, если он вызывает его раньше. – cramopy

+0

Это, наверное, хорошо для этого приложения, но это удивительный и * потенциально важный факт, поэтому я хотел бы указать на это. –

0

Свойство Answers не инициализируется. Вы должны сделать это при построении класса Question,

public Question() 
{ 
    Answers = new AnswerObjectCollection(); 
} 

По умолчанию все свойства и поля будут инициализируется значением по умолчанию (default(T)). Для ссылочных свойств (и полей) значение по умолчанию null, поэтому вы столкнулись с NullReferenceException.

Аналогичная проблема,

AnswerObjectCollection answer = new AnswerObjectCollection(); 
answer.AddRange(GetAnswersByQuestion(currQuestion.QuestionIdentity)); 

здесь вы просто создать отдельную переменную, не связано со свойством Answers класса Question. Таким образом, когда вы это делаете,

currQuestion.Answers.AddRange(answer); 

Вы сталкиваетесь с тем же вопросом, что и раньше.

Оба могут быть исправлены путем инициализации свойства в конструкторе.

Смежные вопросы