0

一般来说,我应该在什么时候使用反射与(浅)克隆方法?

如果我所有的类都有空白构造函数,则使用反射很好,或者编写更好的做法

Clone() 
{ 
    return new MyClass(); 
} 

需要它们的类的方法?

我可以看到该Clone方法更安全,因为它可以在编译时检查,但哪个更快,什么时候使用反射更好?


更新。我不是在寻找特定问题的解决方案,而是学习更多理论以了解如何处理这种性质的问题。

但是,在某些情况下,我正在制作游戏,并且我经常遇到这个问题。例如,游戏允许用户“放置”某些对象。当重复点击时,游戏需要创建多个实例(未知子类)。我想出了三个解决方案:

a) 让选择要放置的对象的菜单保存一个类型,并使用反射重复生成该类型。

b) 让菜单保存对象的实例,并使用反射创建新实例。(现在可以用 MemberwiseClone 代替)

c) 让菜单保存对象的一个​​实例,并在放置第一个实例后使用 Clone 方法创建新实例。

我认为 C 是最好的,但我想了解原因。

我正在寻找的模型答案是这样的(请酌情扩展、更正和完整):

正如您在问题中指出的那样,“克隆”方法通常不仅仅是调用 new() ;它将复制它正在克隆的实例的部分或全部属性。浅克隆复制有限数量的属性,而深度克隆复制所有属性。

如果您只需要创建特定类的新实例,最好使用 Object.MemberwiseClone()。

每次引用实例时都应该使用 Clone 方法,因为您知道该实例将具有 ICloneable 属性。

Activator.CreateInstance() 应保留仅在您没有引用实例时使用,例如当您从文本文件或 XXXXXXX 加载类信息时。

解决创建未知类的新实例问题的方法总是尝试通过类型安全的编译时方法(例如克隆)来完成,并且只在完全不可能的情况下使用反射。

作为优缺点的总结:

克隆/MemberwiseClone

优点:在编译时检查为类型安全,不会在运行时使程序崩溃,运行时更快 缺点:不能总是使用

反射

优点/缺点:与上述相反。

4

2 回答 2

2

如果你真的想要一个浅拷贝,那么你可以很好地使用Object.MemberwiseClone和实现ICloneable接口。

public class Model : ICloneable
{
    public object Clone()
    {
        return MemberwiseClone();
    }
}

如果你真的想要,你可以使用反射来执行浅拷贝。我理解它是有优势的,因为它是自动化的,并且可以扩展以提供深层副本。但是,反射比 Object.MemberwiseClone() 慢,并且在部分信任环境中是不允许的。最初实现的代码也更多。在这里阅读更多

于 2013-07-01T12:56:52.550 回答
0

要创建一个类的新实例:

MyClass obj = new MyClass();

要克隆实例:

MyClass clone = obj.Clone();

如果你想让你的类 Cloneable 你应该实现 ICloneable 接口:

public class MyClass : ICloneable
{
    public MyClass Clone()
    {
        MyClass clone = new MyClass();
        // Copy property values to clone-instance.
        return clone;
    }
}

我不明白为什么要让反射参与创建新实例。

于 2013-07-01T12:47:27.507 回答