1

语境

  • 我有一个List<T>类型Question
  • ClassQuestion反过来又包含一个List<Answer>.
  • Answer有一个名为的成员public Question Question { get; set; },它存储答案所针对的问题。

我正在使用集合初始化语法将Question项目添加到列表中,并使用对象初始化来创建新的Question. 在这样做的同时,我还Answer使用对象初始化语法(嵌套)创建新对象。


问题

如何Question将内部类的成员设置Answer为引用封闭Question对象?Answer我知道创建an 的点,Question甚至没有完全初始化。但是有什么方法可以获取外部Question实例,以便我可以将其设置为内部实例Answer


代码

private List<Question> questions = new()
{
    new Question 
    { 
            Id = 1, 
            Text = "Test Question 1", 
            Difficulty = QuestionDifficulty.Easy, 
            Answers = 
            {
                new Answer { Id = 1, Question = [?] },
                new Answer { Id = 2, Question = [?] }   // What should replace [?] here?
            }
    } 
};
4

2 回答 2

2

这不可能。但是您可以在创建所有答案后将问题设置为所有答案。在使用集合初始化期间,不要为 question 属性赋值。在您的构造函数中,您执行以下操作:

foreach(var question in questions)
{
    foreach(var answer in question.Answers)
    {
         answer.Question = question;
    }
}
于 2021-04-08T06:09:24.280 回答
2

您不能在集合/对象初始化程序中执行此操作,但我认为您首先不应该在此处执行此操作。手写每个答案对应的问题是很容易出错的。您有时也可能忘记这样做。

我建议您为该Answers属性添加一个自定义设置器,该设置器Question还设置答案的Question属性:

private List<Answer> answers;
public List<Answer> Answers {
    get => answers;
    set {
        // If you feel like it, you can also set the old answers' questions to null

        answers = value;
        foreach (var answer in answers) {
            answer.Question = this;
        }
    }
}

然后在对象初始化器中,初始化答案列表,而不仅仅是添加:

private List<Question> questions = new()
{
    new Question 
    { 
            Id = 1, 
            Text = "Test Question 1", 
            Difficulty = QuestionDifficulty.Easy, 
            Answers = new List<Answer> // <--- here! 
            {
                new Answer { Id = 1 },
                new Answer { Id = 2 }
            }
    } 
};

这编译为:

var question = new Question();
...
var list = new List<Answer>();
var answer1 = new Answer();
answer1.Id = 1;
var answer2 = new Answer();
answer2.Id = 2;
list.Add(answer1);
list.Add(answer2);
question.Answers = list;

如您所见,setter 被调用,并且 answers 的Question属性将被设置。

于 2021-04-08T06:15:24.870 回答