C# 设置内部对象';使用C中的对象初始化语法将s成员作为外部对象# 上下文 我有一个问题类型的列表 类问题,依次包含一个列表 类Answer有一个名为public Question Question{get;set;}的成员,该成员存储答案所针对的问题
我使用集合初始化语法将C# 设置内部对象';使用C中的对象初始化语法将s成员作为外部对象# 上下文 我有一个问题类型的列表 类问题,依次包含一个列表 类Answer有一个名为public Question Question{get;set;}的成员,该成员存储答案所针对的问题,c#,this,object-initializers,collection-initializer,C#,This,Object Initializers,Collection Initializer,我使用集合初始化语法将问题项添加到列表中,并通过对象初始化创建新的问题。在这样做的同时,我还使用对象初始化语法(嵌套)创建了新的Answer对象 问题 如何设置内部Answer类的Question成员以引用所包含的Question对象?我知道答案的创建点,问题甚至没有完全初始化。但是有没有办法获取外部问题实例,以便我可以将其设置为内部答案 密码 private List questions=new() { 新问题 { Id=1, Text=“测试问题1”, 困难,困难, 答案= { 新答案
问题
项添加到列表中,并通过对象初始化创建新的问题
。在这样做的同时,我还使用对象初始化语法(嵌套)创建了新的Answer
对象
问题 如何设置内部
Answer
类的Question
成员以引用所包含的Question
对象?我知道答案
的创建点,问题
甚至没有完全初始化。但是有没有办法获取外部问题
实例,以便我可以将其设置为内部答案
密码
private List questions=new()
{
新问题
{
Id=1,
Text=“测试问题1”,
困难,困难,
答案=
{
新答案{Id=1,问题=[?]},
新答案{Id=2,问题=[?]}//这里应该用什么替换[?]呢?
}
}
};
这是不可能的。但您可以在创建问题后将其设置为所有答案。在使用集合初始化期间,不要将值指定给question属性。在构造函数中,执行以下操作:
foreach(var question in questions)
{
foreach(var answer in question.Answers)
{
answer.Question = question;
}
}
这是不可能的。但您可以在创建问题后将其设置为所有答案。在使用集合初始化期间,不要将值指定给question属性。在构造函数中,执行以下操作:
foreach(var question in questions)
{
foreach(var answer in question.Answers)
{
answer.Question = question;
}
}
您不能在集合/对象初始化器中执行此操作,但我认为您首先不应该在那里执行此操作。手写每个答案对应的问题很容易出错。你有时也可能忘记做那件事 我建议您为
Question
中的Answers
属性添加一个自定义设置器,该设置器还可以设置答案的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;
}
}
}
私人列表答案;
公开名单答案{
获取=>答案;
设置{
//如果您愿意,还可以将旧答案的问题设置为空
答案=价值;
foreach(答案中的var答案){
回答:问题=这个;
}
}
}
然后在对象初始化器中,初始化答案列表,而不仅仅是添加到其中:
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 }
}
}
};
private List questions=new()
{
新问题
{
Id=1,
Text=“测试问题1”,
困难,困难,
Answers=new List/您不能在集合/对象初始值设定器中执行此操作,但我认为您首先不应该在集合/对象初始值设定器中执行此操作。手写每个答案对应的问题是非常容易出错的。有时您可能也会忘记执行此操作
我建议您为Question
中的Answers
属性添加一个自定义设置器,该设置器还可以设置答案的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;
}
}
}
私人列表答案;
公开名单答案{
获取=>答案;
设置{
//如果您愿意,还可以将旧答案的问题设置为空
答案=价值;
foreach(答案中的var答案){
回答:问题=这个;
}
}
}
然后在对象初始化器中,初始化答案列表,而不仅仅是添加到其中:
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 }
}
}
};
private List questions=new()
{
新问题
{
Id=1,
Text=“测试问题1”,
困难,困难,
Answers=new List//很好的方法!当一个新问题添加到列表中时,甚至可以使用IList
的自定义实现来设置Question
属性。@someone是的,如果这样做,您就不再需要new List
(假设Answers
在构造函数中初始化),但是我做一个自定义列表实现只是为了这个有点过分:-)这正是我需要的!非常感谢:)@听起来也不错的人。我实际上为问题和答案都有子类,所以我认为自定义类应答列表:IList
也可以合理地创建。Bu现在,我将使用@Sweeper的方法。谢谢:)好的方法!甚至可以在列表中添加新问题时使用IList
的自定义实现来设置Question
属性。@someone是的,如果这样做,您就不再需要新列表了(假设Answers
是在构造函数中初始化的),但是IMO仅仅为此做一个自定义列表实现有点过分:-)这正是我所需要的!非常感谢:)@听起来也不错的人。我实际上有问题
和答案
的子类,所以我认为自定义类回答列表:IList
也可以合理地创建。但现在,我将使用@Sweeper的方法。谢谢:)为什么需要这样做?它是c创建将来可能导致错误的冗余数据结构。最好是计算父级而不是存储它。为什么需要这样做?它会创建将来可能导致错误的冗余数据结构。计算父级而不是存储它。