现实世界的例子非常简单。有一所房子,房子有墙壁等。
class Room {
public List<Wall> Walls{get; set;}
}
class Wall {
public List<WallObject> WallObjects{get; set;}
}
现在,开发人员几年前已将房产空间添加到了隔离墙:
class Wall {
public List<WallObject> WallObjects{get; set;}
public Room Room{ get; set; }
}
在课堂上拥有这个对象是非常愉快的。一个人可以在许多地方访问父元素(430)。但我认为它不属于那里,有时会导致错误,因为你没有设置或改变它。
除了许多情况下的方法移交外,是否还有其他方法。
答案 0 :(得分:1)
没有多少方法可以轻松解决这个问题,但通常我会选择更改所用列表的类型,并使用正确的事件来注册和取消注册父级。
public class Room
{
public ObservableCollection<Wall> Walls { get; } = new ObservableCollection<Wall>();
public Room()
{
Walls.CollectionChanged += Walls_CollectionChanged;
}
private void Walls_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
switch (e.Action)
{
case NotifyCollectionChangedAction.Add:
{
foreach (Wall w in e.NewItems)
{
w.Room = this;
}
break;
}
case NotifyCollectionChangedAction.Remove:
{
foreach (Wall w in e.OldItems)
{
w.Room = null;
}
break;
}
}
}
}
答案 1 :(得分:1)
你是对的,信息是多余的。 timeout
中的retryWhen
可能包含List<Wall>
属性引用不同房间的墙,这可能是一个错误。因此,要么将其从Room
中移除,要么确保在Room
的设置器中检查每个Wall
。如果墙的Wall
为Walls
,您可以抛出异常或更改它。
所以我稍微修改Room
类:
!= this
由于房间通常有4面墙,所以不应该是一件大事。