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

Hai*_*rom 0 c# reflection

我正在重新提出一个我刚问过的问题,但是想以更简洁的方式重新提出这个问题,因为我认为这引起了一些混乱.

我有一个基类:RoomObject.我有两个子类:Bed和Table,它继承自RoomObject.

我有一个变量currentObject,它是RoomObject类型,但实际上将持有Bed或Table的实例(RoomObject永远不会实例化).

如何在不知道其完整类型的情况下克隆我的currentObject?

即如果currentObject是一张床,我想用克隆床

currentObject = new Bed(currentObject); 
Run Code Online (Sandbox Code Playgroud)

如果currentObject是一个表,我想使用

currentObject = new Table(currentObject);
Run Code Online (Sandbox Code Playgroud)

我可以通过调用Activator.CreateInstance(currentObject.GetType())来使用反射,然后复制我需要的任何属性,但这看起来很混乱.

das*_*ght 6

您应该使用称为虚拟构造函数的模式或克隆方法.

添加一个虚方法RoomObject,返回当前对象的副本:

abstract RoomObject Clone();
Run Code Online (Sandbox Code Playgroud)

现在实现此方法Bed返回new Bed(...),并在Table返回new Table(...).传递构造函数所需的任何参数,BedTable复制当前对象中的内容.

.NET有一个ICloneable通常用于实现此模式的接口.这种方法的一个小缺点是Clone必须返回object,不是RoomObject,所以如果你需要RoomObject,你需要抛出它.