假设我有一个父/子关系ob对象,并尝试内联创建一个父对象(我不确定这是正确的单词)。是否可以在自己的创建代码中引用创建的父代?
Parent = new Parent(
{
Name = "Parent",
Child= new Child(/*ReferenceToParent*/)
});
答案 0 :(得分:2)
唯一的方法是Parent
构造函数调用Child
构造函数本身并传入this
。您的对象初始化程序(我假设您正在尝试这样做)可以在子项上设置其他属性:
public class Parent
{
public Child Child { get; private set; }
public string Name { get; set; }
public Parent()
{
Child = new Child(this);
}
}
public class Child
{
private readonly Parent parent;
public string Name { get; set; }
public Child(Parent parent)
{
this.parent = parent;
}
}
然后:
Parent parent = new Parent
{
Name = "Parent name",
// Sets the Name property on the existing Child
Child = { Name = "Child name" }
};
我会尝试以避免这种关系 - 随着时间的推移它会变得越来越棘手。
答案 1 :(得分:1)
您无法执行此操作,因为尚未创建Parent的实例。如果child在其构造函数中需要Parent的实例,则必须创建一个。 首先创建Parent的实例,然后将Parent传递给构造函数,然后将child的实例分配给Parent上的属性。
var parent = new Parent
{
Name = "Parent",
//More here...
};
var child = new Child(parent);
parent.Child = child;
答案 2 :(得分:1)
不,因为引用在构造函数的执行完成后开始引用已分配的对象。
答案 3 :(得分:0)
这已经很旧了,在较新的 C# 版本中似乎没有新的解决方案,是吗?如果是这样,请分享。
与此同时,我想添加另一种类似于已接受但不同的解决方案。它假定您可以更改 Parent 类。
using System;
public class Program
{
public static void Main()
{
Parent p = new Parent()
{
Name = "Parent",
Child = new Child()
};
Console.WriteLine(p.Child.Parent.Name);
}
public class Parent
{
public string Name {get; set;}
public Child Child {
get { return this._child; }
set {
this._child = value;
if(value != null)
value.Parent = this;
}
}
private Child _child;
}
public class Child
{
public Parent Parent {get; set;}
}
}
可以在this link中执行。