我正在制作一款游戏,其中涉及将物体放置在房间中。房间存储可以放置在其中的对象列表,例如
List<RoomObject> possibleObjects = new List<RoomObject>(){ new Bed(), new Table() };
然后将这些对象分别发送到允许用户单击按钮的按钮,进入所选对象的放置阶段,然后用户在房间中单击并放置对象。
例如
public Room currentRoom;
public RoomObject currentObject;
//...
public void onClick()
{
if (CanPlace) currentRoom.Add(currentObject);
}
我的问题是,如果用户想要放置多个相同的对象,当前的设置方式将意味着完全相同的对象将被添加到房间中,并且如果该对象稍后以某种方式被编辑(例如 Bed.occupied = true),它将影响房间中该类型的所有对象。
有没有一种方法可以复制一个对象(以获得单独的引用)而不必使用反射(我不是很熟悉,感觉是不安全的代码)。
我假设反射方式将传递一个 Type,然后必须使用 Type.GetConstructor 调用构造函数,但如果可能,我宁愿不这样做。如果反射是唯一的方法,有人可以提供示例代码来说明如何做吗?
编辑 - 也许我需要指定我的变量 currentObject 将不包含 RoomObject 类型的变量,而是一个子类,例如 Bed。 (床继承自 RoomObject)。
最佳答案
您应该为您的对象定义一个复制构造函数。这将允许您根据该类的另一个实例的值来实例化一个类。这是一个教程:
http://msdn.microsoft.com/en-us/library/ms173116(v=vs.80).aspx
public class RoomObject
{
public RoomObject(RoomObject roomObject)
{
//Copy room object properties
}
}
public class Bed : RoomObject
{
public Bed(Bed bed) : base(bed)
{
//Copy Bed properties
}
}
用法
Bed bedOne = new Bed();
Bed bedTwo = new Bed(bedOne); //Create a bed using Bed copy constructor
RoomObject roomObject = new RoomObject(bedOne) //Creates a room object using RoomObject copy constructor
进一步编辑
public abstract class RoomObject<T> where T : new()
{
protected T CreateRoomObjectCopy(T roomObject)
{
T concreteType = new T();
//Copy Room object properties
return concreteType;
}
public abstract T Copy(T roomObject);
}
public class Bed : RoomObject<Bed>
{
public override Bed Copy(Bed roomObject)
{
Bed newBed = CreateRoomObjectCopy(roomObject);
//Copy bed properties
return newBed;
}
}
关于C# 创建同一个类的另一个实例 - 反射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13841454/