对象属性如何知道它的父项?

时间:2012-11-14 10:08:43

标签: c# c#-4.0 object-oriented-analysis

假设计划:

class ComplexProperty
{
    string PropertyName {get; set;}
    string Description {get; set;}
    string GetParentName(); // How can this be implemented?
}

class Parent
{
    string ParentName {get; set;}
    ComplexProperty Property {get; set;}
}

问题是从ComplexProperty内部获取ParentName。

我提出的最佳解决方案是使用Parent的构造函数初始化属性,但是当您从其他位置设置属性时,这很容易出错并失败。

例如:

class Parent
{
    public Parent()
    {
       ComplexProperty = new ComplexProperty(this); // Store an instance of the parent inside the property
    }
    string ParentName {get; set;}
    ComplexProperty Property {get; set;}
}

有关于此的任何想法?这种架构有没有最佳实践?请注意,ComplexProperty将始终是特定接口实现的子代,因此反射是一种可行但不是理想的解决方案。

3 个答案:

答案 0 :(得分:1)

一种方法是保留Parent属性并将其设置在ComplexProperty设置器中。

class ComplexProperty
{
    public string PropertyName {get; set;}
    public string Description {get; set;}
    public IParent Parent {get; set;}
    public string GetParentName() 
    {
        return this.Parent == null ? null : this.Parent.Name;
    }
}

interface IParent
{
    string Name {get; set;}
}
class Parent : IParent
{
   public string ParentName {get; set;}

   private ComplexProperty _prop;
   public ComplexProperty Property 
   {
      get { return _prop; }
      set 
      {
          _prop = value;
          _prop.Parent = this; 
      }
   }
}

答案 1 :(得分:0)

你可以使用一个功能

class ComplexProperty
{   
    private readonly Func<string> GetParentNameFunc;

    string PropertyName {get; set;}
    string Description {get; set;}
    string GetParentName {get {return GetParentNameFunc(); } }

    public ComplexProperty(Func<string> GetParentNameFunc)
    {
      this.GetParentNameFunc = GetParentNameFunc;
    }
}

class Parent
{
    string Name {get; set;}
    ComplexProperty Property {get; set;}

    //...
    //...

    SomeMethodOrCtor()
    {
      Property = new ComplexProperty(()=>{ return this.Name; });
    }

}

答案 2 :(得分:0)

您可以使用EntityFramework,它基本上用于处理这种关系。但是,它带来了我不太欣赏的开销。看看这个框架有多少问题最终在这里......

或者您也可以编写自己的代码。在我制作的一个建模编辑器中,我最终得到了一个组件/实体设置,组件需要知道它的父级才能知道空间位置。组件可能还需要知道包含实体的场景。

使用构造函数是一种方法,但可能不适用于所有内容,因为您可能还不知道父级的身份。

您还可以使用访问者,当您更改属性时,在您收到的对象中调用类似“SetParent”的内容。

此外,在序列化中,我最终进行了重建父级设置,因为序列化层次结构太过分了。从顶部调用,我会在包含的每个对象中设置父对象,然后在所有子对象中调用它,依此类推。

当然,你必须假设一个对象只有一个父对象。如果您的整个代码从一开始就以这种方式构建,那么管理起来并不是很难。