2014-01-11 72 views
0

我一直在试图找出这几天。对象之间的参考

我有什么是三类,我们姑且称之为城,楼,室:

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

所以,在这里我们有一个城市,它拥有很多的房子。 房子里有房间。

比方说,比如我得到一个房间对象,它有一个名字(以及与城市 - 整个系统> House - 临近>客房分组)

我将如何能够引用的城市对象来自该房间对象的名称变量?

喜欢做“Room.House.City.Name”

的一些神奇的方式我真的希望你明白我想请问一下,它已经快把我逼疯的最后几天。

+0

您必须修改'Room'和'House'类以包含对其父项的引用。 – Lee

+0

如果House的构造函数将包含City的参数作为参数,那么它可以将房屋添加到城市住宅中,并在房屋中保留当地参考。否则,你会留下寻找房屋的城市。同样的房间/房子关系。和狗。 – HABO

回答

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 

但是这不是很优雅,很难添加新的房屋和房间。另外,我会添加一些方法,例如在侯SE类:

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" }); 
+0

正是我在说什么!谢谢你展示你如何去增加彼此的课程!非常感谢! – Tokfrans

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

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

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

通常情况下,你不能从一个属性导航到它的容器。这只有在房间对象中有房屋等属性时才有可能,并且如果确保在为房间分配房屋时,还可以在房间中设置房屋属性。

但是,你可以使用一些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会找到很多候选人。

+0

可能的System.NullReferenceException在这种情况下为 –

+0

请确保您的所有城市都将房屋设置为房屋列表,并且所有房屋都有房间。您可以在城市和住宅对象的构造函数中添加如下内容:this.Houses = new List ()以确保如果您在该城市没有任何房屋,则该房产是空列表而不是空列表目的。在House对象的房间列表中做同样的事情。 – Cosmin