我正在制作一个涉及将物品放在房间里的游戏。房间存储可放置在其中的对象列表,例如
List<RoomObject> possibleObjects = new List<RoomObject>(){ new Bed(), new Table() };
然后将这些对象分别发送到按钮,允许用户单击按钮,输入所选对象的放置阶段,然后用户在房间中单击,放置对象。
e.g。
public Room currentRoom;
public RoomObject currentObject;
//...
public void onClick()
{
if (CanPlace) currentRoom.Add(currentObject);
}
我的问题是,如果用户想要放置多个相同的对象,那么它设置的当前方式将意味着将完全相同的对象添加到房间中,并且如果该对象稍后以某种方式进行编辑(例如,Bed.occupied = true),它将影响房间中该类型的所有物体。
有没有办法复制一个对象(以获得一个单独的引用)而不必使用反射(我不是很熟悉,并且觉得代码不安全。)
我假设反射方式是传递一个Type然后必须使用Type.GetConstructor调用构造函数,但是如果可能的话我宁愿不这样做。如果反射是唯一的方法,有人可以提供如何做的示例代码吗?
编辑 - 也许我需要指定我的变量currentObject不会包含Type RoomObject的变量,而是像Bed这样的子类。 (床继承自RoomObject)。
答案 0 :(得分:4)
您应该为对象定义复制构造函数。这将允许您基于来自该类的另一个实例的值来实例化一个类。这是一个教程:
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;
}
}
答案 1 :(得分:2)
使用复制构造函数或使用反射。
使用反射它并不像你想象的那么复杂,这是一个使用Activator类和Type的问题,你可以获得该类型的实例。
答案 2 :(得分:0)
反射没有什么不安全的。它是.NET等托管语言的优点之一。
我可能错了,但听起来你想要克隆一个对象实例(而不是对同一个实例有两个引用)。
请查看以下链接。
其他强>
您可以尝试实现ICloneable,从而提供自己克隆对象的机制
<强>〔实施例:强>
public class RoomObject : ICloneable
{
public object Clone()
{
return new RoomObject { X = this.X, Y = this.Y, Z = this.Z };
}
}
RoomObject ro = new RoomObject();
RoomObject ro2 = (RoomObject)ro.Clone();
答案 3 :(得分:0)
class Program
{
static void Main(string[] args)
{
Bed bed = RoomObject.RoomName("Bed");
Console.WriteLine(bed.name);
//outline:Bed
Console.Read();
}
}
public class RoomObject
{
public static Bed RoomName(string BedName)
{
Bed newBed = new Bed();
newBed.name = BedName;
return newBed;
}
}
public class Bed
{
public string name { get; set; }
}