c# - 同一类(class) child 列表之间的映射

标签 c# oop

这个问题看起来很简单,但我真的无法解决这个问题,同时我不想通过解决方法。我有这个 XML 文件

<Master>
  <Parent1>
     <child1/>
     <child1/>
     <child1/>
  </Parent1>
  <Parent2>
     <child2/>
     <child2/>
     <child2/>
  </Parent2>
</Master>

我在当前类结构中反序列化它

Class Master
{
  List<child1> Parent1;
  List<child2> Parent2;
}

只要 Child2 发生变化,它就会显示在 UI 上,因为 child1 的 ID 与 child2 相同。问题是在 child2 中,我无法访问 Parent1,所以如何才能返回到 child1 中进行更改。我需要一个好的解决方案,而不是解决方法。

编辑: Child1 和 Child2 是两个不同的类,但它们的属性之间存在一定的映射关系。

最佳答案

您可以让每位家长知道添加/删除了哪些 child 。 每个 parent 都会收到事件,如果它是匹配的 child (或由于其他逻辑而相关),将处理它。

两个用于parent和master之间通信的公共(public)对象:

public enum ChangeType { Added, Removed }

public delegate void ChildChangeEvent(Parent parent, Child child, ChangeType changeType);

父类有两个主要角色——如果它有一个添加/删除的 child 则引发一个事件,如果其他 parent 提出并与他们相关则处理这个事件。

class Parent
{
    public event ChildChangeEvent ChildChangeEvent;

    private List<Child> _children;

    public void Add(Child child)
    {
        _children.Add(child);

        ChildChangeEvent(this, child, ChangeType.Added);
    }

    public void Remove(Child child)
    {
        _children.Remove(child);

        ChildChangeEvent(this, child, ChangeType.Removed);
    }

    public void NotifyChange(Parent parent, Child child, ChangeType changeType)
    {
        //do where you want with this info.. change local id or whatever logic you need
    }
}

Master 类应该通知所有家长关于添加/删除的 child 其中一位家长提出的事件:

class Master
{
    private List<Parent> _parents;

    public void AddParent(Parent parent)
    {
        _parents.Add(parent);
        parent.ChildChangeEvent += parent_ChildChangeEvent;
    }

    void parent_ChildChangeEvent(Parent parent, Child child, ChangeType changeType)
    {
        foreach (var notifyParent in _parents)
        {
            notifyParent.NotifyChange(parent, child, changeType);
        }
    }

}

关于c# - 同一类(class) child 列表之间的映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32553594/

相关文章:

c# - 在无法访问其余代码的情况下编写 C# nunit 测试

python - python 2.7 中的 __add__ 矩阵方法

c - 我应该从代表人力资源管理系统中员工的抽象数据类型中抽象出数据库 API 吗?

c++ - 使用模板时获取 "Trigger Breakpoint Error at delete"

C++对象在for循环后获得剩余值

c# - 根据输入添加或减去固定值的优雅方式

c# - 如何执行 linq 查询以查找数据集中存在于集合的每条记录中的字段?

c# - 用于格式化货币数字的最佳层是什么?

c# - 如何遍历控件以获得特定类型的控件?

c++ - 处理组合关系中的变量