如何在C#类中创建一个父级属性?

5
例如,在下面的类中,我需要在 Cupboard 和 Shelf 中有一个名为 Parent 的属性。我该怎么做?
public class Room
{
    public List<Cupboard> Cupboards { get; set; }
}

public class Cupboard
{
    public Room Parent 
    {
        get
        {

        }
    }
    public List<Shelf> Shelves { get; set; }
}

public class Shelf
{

}

3
虽然这与你的问题并不相关,但每当我看到带有公共 setter 的 List<T> 属性时,我都会感到非常怀疑。这几乎从来不是一个好主意。 - Dan Tao
1个回答

6

您可以使用自动实现属性:

public class Cupboard
{
    public Room Parent { get; set; }
}

您也可以选择将setter设置为私有,并在构造函数中进行设置。

public class Cupboard
{
    public Cupboard(Room parent)
    {
        this.Parent = parent;
    }

    public Room Parent { get; private set; }
}

使用方法:

Room room = new Room();
Cupboard cupboard = new Cupboard(room);
Console.WriteLine(cupboard.Parent.ToString());

如果您有许多对象都有一个父房间,您可能希望创建一个接口,以便您可以找出哪个房间是对象的父级,而不必知道其具体类型。
interface IRoomObject
{
    Room { get; }
}

public class Cupboard : IRoomObject
{
    // ...
}

我不确定我做错了什么,我尝试了你提到的前两种方法,但父级仍然显示为空。实际上,这是一个WCF服务,我正在使用LINQ从XML数据填充字段。 - coder
@gangt:我已经添加了一些代码,展示了你可以使用第二个例子的一种方式。 - Mark Byers
这里是LINQ:var rooms = (from room in UIDocument.Descendants("rooms") select new Room { Cupboards = UIDocument.Descendants("cupboards").Where(frame => frame.Element("roomdid").Value == room.Element("roomid").Value).Select(cupboard => new Cupboard { }).ToList() }); - coder
在LINQ中,我无法弄清如何设置Parent属性。 - coder
@gangt:当你创建橱柜时,房间甚至还不存在,所以你肯定想不出如何设置父属性。如果你坚持要使用LINQ,那么尝试在运行此代码后通过遍历列表来设置所有父属性:foreach (Room room in rooms) { foreach (Cupboard cupboard in room.Cupboards) { cupboard.Parent = room; }}但是,LINQ并不是这个任务的最佳工具。 - Mark Byers
完美,可以运行。但是我在想,这会影响性能吗?谢谢。 - coder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接