对象之间的引用

时间:2014-01-11 21:13:06

标签: c# reference parent

我一直试图解决这个问题。

我所拥有的是三个班级,让我们称之为城市,住宅,房间:

class City
{
    List<House> Houses { get; set; }
    string Name { get; set; }
}

class House
{
    List<Room> Rooms { get; set; }
    string Name { get; set; }
}

class Room
{
    string Name { get; set; }
}

所以,在这里,我们有一个拥有大量房屋的城市。 房子里有房间。

比方说我得到一个房间对象,它有一个名字(并在整个系统中与City-&gt; House-&gt; Room分组)

我如何能够从我拥有的Room对象中引用City-objects Name变量?

像一些做“Room.House.City.Name”的神奇方式

我真的希望你明白我想问的是,过去几天这让我发疯了。

4 个答案:

答案 0 :(得分:3)

为了实现这一点,你必须在你的类中添加额外的类似父类的引用:

class City
{
    List<House> Houses { get; set; }
    string Name { get; set; }
}

class House
{
    List<Room> Rooms { get; set; }
    string Name { get; set; }
    City City { get; set; }
}

class Room
{
    string Name { get; set; }
    House House { get; set; }
}

更新

因为我不认为有没有城市和没有房子的房间的房子,我会在HouseRoom类添加构造函数,将它们绑定到父母:

class House
{
    public House(City city)
    {
        City = city;

    }
    List<Room> Rooms { get; set; }
    string Name { get; set; }
    City City { get; set; }
}

class Room
{
    public Room(House house)
    {
        House = house;
    }
    string Name { get; set; }
    House House { get; set; }
}

答案 1 :(得分:2)

您可以将House媒体资源添加到您的City房产House以及class House { List<Room> Rooms { get; set; } string Name { get; set; } public City City { get; set; } } class Room { string Name { get; set; } public House House { get; set; } } 这样:

    City myCity = new City();
    House myHouse = new House { City = myCity, Name = "myHome" };
    Room myRoom = new Room { House = myHouse, Name = "myRoom" };
    myHouse.Rooms = new List<Room>();    
    myHouse.Rooms.Add(myRoom);
    myCity.Houses = new List<House>();        
    myCity.Houses.Add(myHouse);
    // here you can use:
    myRoom.House.City.Name

当你添加一些房子和房间时,例如:

class House 
{
     public void AddRoom(Room room)
     {
        room.House = this;
        if (Rooms == null)
            Rooms = new List<Room>();
        Rooms.Add(room);
     }
}

但这并不是那么优雅,很难添加新的房屋和房间。另外我会添加一些方法,以便在House类中轻松实现:

Room myRoom = new Room { House = myHouse, Name = "myRoom" };

然后我不需要像这样定义一个房间:

myHouse.AddRoom(new Room { Name = "myRoom" });

相反:

{{1}}

答案 2 :(得分:1)

您必须更改类以包含对其父级的引用,例如

class Room
{
    House House { get; set; }
    string Name { get; set; }
}

class House
{
    List<Room> Rooms { get; set; }
    string Name { get; set; }
    City City { get; set; }
}

答案 3 :(得分:1)

通常,您无法从属性导航到其容器。只有在Room对象中还有House这样的属性,并且如果确定在为House分配房间时,您也可以在房间中设置House属性。

但是,您可以使用一些LINQ获取城市名称,如下所示:

var cityWithSomeRoom = cities.Where(c = > c.Houses.Contains(h => h.Rooms.Contains(r => r.ReferenceEquals(someRoom))).FirstOrDefault();
cityWithSomeRoom.Name ; // this is your name

someRoom是您要在哪个城市居住的房间实例。此外,请确保不要将同一个房间对象添加到多个房屋,因为ReferenceEquals会找到许多候选房屋。