假设计划:
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
将始终是特定接口实现的子代,因此反射是一种可行但不是理想的解决方案。
答案 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”的内容。
此外,在序列化中,我最终进行了重建父级设置,因为序列化层次结构太过分了。从顶部调用,我会在包含的每个对象中设置父对象,然后在所有子对象中调用它,依此类推。
当然,你必须假设一个对象只有一个父对象。如果您的整个代码从一开始就以这种方式构建,那么管理起来并不是很难。