繁体   English   中英

用类的对象填充列表

[英]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.

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