1

假设方案:

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.

我想出的最佳解决方案是使用 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将始终是特定接口实现的子级,因此反射是一种可行但不理想的解决方案。

4

3 回答 3

1

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

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; 
      }
   }
}
于 2012-11-14T10:21:56.793 回答
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; });
    }

}
于 2012-11-14T10:23:42.397 回答
0

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

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

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

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

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

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

于 2012-11-14T10:29:58.267 回答