[英]Populate a list with objects of a class
我目前正在使用隨機生成的房間制作游戲,因為我要遍歷新創建的房間以檢查其坐標以將它們添加到圖形上,而我有一個房間列表。
list<Room> listOfAllRooms;
我可以繼續使用笨拙的方式指定所有房間對象的存儲位置。
list<Room> listOfAllRooms = new List<Room> {roomObject.room1, ...}
它們存儲在另一個類中只是為了保持整潔,就像這樣...
public class RoomObjects { public static Room room1 = new Room(); .....}
一路25個房間。
這是令人難以置信的混亂,如果我擴展到當前正在使用的當前25個房間之外,將會造成嚴重的問題。 在我看來,應該有一種方法可以直接從一個整潔的源中填充所有房間的列表。 因此,實際上我的問題歸結為有沒有更好的方法來聲明這些對象並將它們自動存儲到列表中? 還是至少沒有一種自動將每個房間添加到列表中的方法?
(請注意,我有很大一部分代碼與所有房間的列表一起使用,所以我希望不必重新編寫代碼即可解決此問題)
您的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()));
}
}
如果這不是您想要的,請隨時糾正我。
盡管這不是一種優雅的解決方案,但是在您進行重構或更改設計之前,您仍然需要使用反射,但是我們可以准備可用房間的列表,假設在很多地方直接使用了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;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.