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

C#创建同一类反射的另一个实例?,c#,reflection,C#,Reflection,我在做一个游戏,把东西放在房间里。房间存储可放置在其中的对象列表,例如: List<RoomObject> possibleObjects = new List<RoomObject>(){ new Bed(), new Table() }; 我的问题是,如果用户想要放置多个相同对象,当前的设置方式将意味着将向房间中添加完全相同的对象,并且如果该对象稍后以某种方式编辑(例如Bed.occulard=true),则会影响房间中该类型的所有对象 有没有一种方法可以复制一个对

我在做一个游戏,把东西放在房间里。房间存储可放置在其中的对象列表,例如:

List<RoomObject> possibleObjects = new List<RoomObject>(){ new Bed(), new Table() };
我的问题是,如果用户想要放置多个相同对象,当前的设置方式将意味着将向房间中添加完全相同的对象,并且如果该对象稍后以某种方式编辑(例如Bed.occulard=true),则会影响房间中该类型的所有对象

有没有一种方法可以复制一个对象(以获得一个单独的引用),而不必使用反射(我不太熟悉反射,觉得反射是不安全的代码)

我假设反射方式是传递一个类型,然后必须使用Type.GetConstructor调用构造函数,但如果可能的话,我不希望这样做。如果反射是唯一的方法,有人能提供示例代码来说明如何做吗


编辑-也许我需要指定我的变量currentObject将不包含RoomObject类型的变量,而是包含一个子类,如Bed。(Bed继承自RoomObject)。

您应该为对象定义副本构造函数。这将允许您基于来自该类的另一个实例的值实例化该类。以下是一个教程:

用法

进一步编辑

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;
    }
}
公共抽象类RoomObject,其中T:new()
{
受保护的T CreateRoomObjectCopy(T roomObject)
{
T concreteType=新的T();
//复制室对象属性
返回类型;
}
公共摘要T副本(T roomObject);
}
公共类床位:RoomObject
{
公共覆盖床副本(Bed roomObject)
{
Bed newBed=CreateRoomObjectCopy(roomObject);
//复制床属性
返回新的;
}
}

您应该为对象定义一个复制构造函数。这将允许您基于来自该类的另一个实例的值实例化该类。以下是一个教程:

用法

进一步编辑

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;
    }
}
公共抽象类RoomObject,其中T:new()
{
受保护的T CreateRoomObjectCopy(T roomObject)
{
T concreteType=新的T();
//复制室对象属性
返回类型;
}
公共摘要T副本(T roomObject);
}
公共类床位:RoomObject
{
公共覆盖床副本(Bed roomObject)
{
Bed newBed=CreateRoomObjectCopy(roomObject);
//复制床属性
返回新的;
}
}

使用复制构造函数或反射


使用反射并不像您想象的那么复杂,只需将类与类型一起使用,就可以获得该类型的实例。

使用复制构造函数或使用反射


使用反射并不像您想象的那么复杂,只需将类与类型一起使用,就可以获得该类型的实例。

反射没有什么真正不安全的地方。它是像.NET这样的托管语言的优点之一

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

看看下面的链接

附加:

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();
您可以尝试实现iClonable,从而提供自己的机制来克隆对象

Exmaple:

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();

反思没有什么真正不安全的。它是像.NET这样的托管语言的优点之一

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

看看下面的链接

附加:

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();
您可以尝试实现iClonable,从而提供自己的机制来克隆对象

Exmaple:

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();

这看起来很有用,但我的所有对象都继承自RoomObject。如果我当前正在放置一张床(它具有RoomObject的附加属性),我如何引用Bed自己的构造函数?我有一个对我的床的特定实例的引用,但它保存在RoomObject类型的变量中。我不能新建RoomObject(currentObject),因为currentObject将是一个子类?每个类都可以定义自己的复制构造函数。它可以为公共类数据调用基构造函数,然后复制扩展字段。参见上面的示例。@Haighstrom您还可以创建一个
抽象
复制
方法,这意味着
必须实现它。然后,当您有一个
Bed
并通过接口执行该方法时,它将执行正确的方法。@JustinHarvey那么我如何调用Bed(或其他RoomObject子类)的构造函数呢?如果我只调用new RoomObject(currentObject),其中currentObject的类型为Bed,那么它会使用上面的代码实例化Bed而不是RoomObject吗?@Haighstrom,有关用法,请参见上面的编辑。基类构造函数只能实例化自己类型的对象。这看起来很有用,但我的所有对象都继承自RoomObject。如果我当前正在放置一张床(它具有RoomObject的附加属性),我如何引用Bed自己的构造函数?我有一个对我的床的特定实例的引用,但它保存在RoomObject类型的变量中。我不能新建RoomObject(currentObject),因为currentObject将是一个子类?每个类都可以定义自己的复制构造函数。它可以为公共类数据调用基构造函数,然后复制扩展字段。参见上面的示例。@Haighstrom您还可以创建一个
抽象
复制
方法,这意味着
必须实现它。然后,当您有一个
Bed
并通过接口执行该方法时,它将执行正确的方法。@JustinHarvey那么我如何调用Bed(或其他RoomObject子类)的构造函数呢?如果我只调用新的RoomObject(currentObject),其中currentObject是Bed类型,那么