我正在制作一个随机生成的房间游戏,因为我遍历新创建的房间,检查他们的坐标,将它们添加到图表中,我有一个房间列表。
list<Room> listOfAllRooms;
我可以继续使用笨重的方式来指定所有房间对象的存储位置。
list<Room> listOfAllRooms = new List<Room> {roomObject.room1, ...}
它们存储在另一个类中只是为了保持整洁,就像这样......
public class RoomObjects { public static Room room1 = new Room(); .....}
一直到25个房间。
这超出了所有人的信念,如果我扩展到目前正在使用的当前25个房间之外,这将产生一个严重的问题。 在我看来,应该存在一种方法来直接从一个干净整洁的源填充所有房间的列表。 所以我的问题归结为是否有更好的方法来声明这些对象并自动将它们存储到列表中?或者如果不是至少一种方法将每个房间自动添加到列表中?
(注意,我有很大一部分代码使用了所有房间的列表,所以我希望我不必重写它来解决这个问题)
答案 0 :(得分:3)
您的Room
班级:
public class Room
{
public string NameRoom { get; set; }
}
要创建Room类的对象,可以使用模式Factory Pattern
。通过这种模式,我们开发了一种抽象,它隔离了创建类的逻辑。该模式的实现非常简单,请参阅:
public static Room FactoryOfRoom(string roomName)
{
return new Room() { NameRoom=roomName };
}
此代码可以通过Factory Pattern
模式填充您的列表:
static void Main(string[] args)
{
List<Room> listRoom = new List<Room>();
for (int i = 0; i < 25; i++)
{
listRoom.Add(FactoryOfRoom(i.ToString()));
}
}
如果不是您想要的,请随时纠正我。
答案 1 :(得分:0)
虽然不是优雅的解决方案,但在你的情况下使用反射直到我们重构或改变设计的时候,我们可以准备可用房间的列表,假设room1, room2
等,在许多地方直接使用而不是使用List<Room>
但使用List<Room>
的新代码。
我强调这只是为了显示另一种可能性:
public class RoomObjects
{
public static Room room1 = new Room { Id = 1 };
public static Room room2 = new Room();
public static int room3 = 0; //Took int type for test that Room & Int32 type castings don't mess up while reflecting
public List<Room> GetRoomObjects()
{
List<Room> availableRooms = new List<Room>();
var allRoomFields = this.GetType().GetFields(); //GetProperties() in case of properties we want to reflect over.
foreach (var roomFieldInfo in allRoomFields)
{
Room tempRoom = roomFieldInfo.GetValue(this) as Room; //Here Int32 field won't throw invalid cast exception while casting to Room type
if (tempRoom != null)
{
availableRooms.Add(tempRoom);
}
}
return availableRooms;
}
}