如何在内联创建对象时引用父级?

时间:2011-07-27 12:00:47

标签: c#

假设我有一个父/子关系ob对象,并尝试内联创建一个父对象(我不确定这是正确的单词)。是否可以在自己的创建代码中引用创建的父代?

Parent = new Parent(
{
    Name = "Parent",
    Child= new Child(/*ReferenceToParent*/)
});

4 个答案:

答案 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中执行。