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

时间:2012-12-12 14:01:03

标签: c# reflection

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

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)。

4 个答案:

答案 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等托管语言的优点之一。

我可能错了,但听起来你想要克隆一个对象实例(而不是对同一个实例有两个引用)。

请查看以下链接。

Deep cloning objects

How to Clone Objects

其他

您可以尝试实现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; }
}