繁体   English   中英

对象之间的引用

[英]References between objects

我已经尝试了好几天了。

我有三个班级,我们称它们为“城市”,“房屋”,“房间”:

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; }
}

因此,这里有一个拥有很多房屋的城市。 房屋拥有房间。

举例来说,假设我得到一个房间对象,该对象的名称(在整个系统中通过“城市”->“房屋”->“房间”分组)

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

就像做“ Room.House.City.Name”的一些神奇方法一样

我真的希望您了解我要问的问题,最近几天一直让我发疯。

为了使之成为可能,您必须在类中添加其他类似父类的引用:

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; }
}

您可以将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);
     }
}

然后,我不需要定义这样的房间:

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

代替:

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

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

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; }
}

通常,您无法从属性导航到其容器。 仅当在“房间”对象中还具有“房屋”之类的属性,并且确保将“房间”分配为“房屋”时,还可以在“房间”中设置“房屋”属性,才有可能。

但是,您可以使用一些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是您要查找所在城市的Room实例。 另外,请确保不要将同一房间对象添加到多个房屋中,因为ReferenceEquals会找到很多候选对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM