C# 创建同一个类的另一个实例 - 反射?

标签 c# reflection

我正在制作一款游戏,其中涉及将物体放置在房间中。房间存储可以放置在其中的对象列表,例如

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/

相关文章:

c# - 强制看不见的 PictureBox 加载图像

c# - 从字符串中删除转义字符 "\"

c# - 如何避免在 Radwindow Open 上回发?

c# - 为什么在 Controller 上设置了 SessionStateBehavior.ReadOnly 后我仍然可以写入 session ,我应该关心吗?

java - Java 内存中的动态编译类以及依赖于这些类的类

reflection - 如何通过反射使用 Kotlin 对象

c# - 真或假 : one should have Windows PC to program MonoGame games

Java反射适当性

java - 通过反射调用带有参数的方法

java - 在java中创建对象,在编译时不知道类