如何在对象的内联创建中引用父对象

本文关键字:对象 创建 引用 | 更新日期: 2023-09-27 18:03:46

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

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

如何在对象的内联创建中引用父对象

解决这个问题的唯一方法是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" }
};

我会尝试避免这种关系-随着时间的推移,它会变得越来越棘手。

您不能这样做,因为还没有创建Parent的实例。如果child在其构造函数中需要Parent的实例,则必须创建一个。首先创建Parent的实例,然后将Parent传递给构造函数,然后将Child的实例赋值给Parent的属性。

var parent = new Parent
{
  Name = "Parent",
  //More here...
};
var child = new Child(parent);
parent.Child = child;

不能,因为引用在构造函数执行完成后才开始引用分配的对象

这是相当旧的,它看起来没有新的解决方案,在较新的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;}
    }  
}

可在此链接中执行