我一直试图解决这个问题。
我所拥有的是三个班级,让我们称之为城市,住宅,房间:
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”的神奇方式
我真的希望你明白我想问的是,过去几天这让我发疯了。
答案 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; }
}
的更新强> 的
因为我不认为有没有城市和没有房子的房间的房子,我会在House
和Room
类添加构造函数,将它们绑定到父母:
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会找到许多候选房屋。