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类型,那么