2016-03-08 141 views
1

这只是一个'出于好奇'的问题,所以我不能提供一个基于当前问题的真实世界示例,但是有一些虚拟代码应该足够了。我想知道的是,如果有一种直接(并且特别快速)的方式将对象的实例映射到'this'(当前实例的类型完全相同,可以访问私有成员等)将对象实例映射到'this'?

public class MyObject { 
    public MyObject(MyObject other) { 
     // of course, won't work 
     this = other; 
    } 
} 

我见过的所有示例和操作方法都是过度使用反射,甚至构建完整的表达式树或使用像Automapper这样的框架,当想法看起来“相当平凡”时,它们都有自己的局限性。为什么不可能将所有指针/引用等从内存中的某个位置复制到另一个位置,因为分配的空间等是完全相同的?

+0

您可以使用ISerializable –

+0

克隆它因为“复制”是一个比您假设的更复杂的复杂过程。假设类有一个List类型的字段。你是否复制引用,或者你是否创建了一个新列表并将其中的元素复制到它中?如果你使用后者,你是复制项目引用还是需要复制项目对象?他们的领域应该发生什么?如果您没有足够的访问权限来做到这一点,该怎么办?试着用语言解决这个问题,你会得到一个C++ frankenlanguage。 –

回答

1

AFAIK,没有一个简单的方法来为自己的实例(this)做这件事。我想,将其他实例的数据复制到此就足够了。对你来说可能的替代方案是使用静态实例,但如果你需要使用多于一个实例的话,这会有一些特殊之处。 PS:我从我的手机写了这篇文章,所以如果遇到小错误,请原谅我,因为在发布之前我无法测试它。一旦我能够测试代码,我会尽快更新该帖子。

1

如果这是可能的,那么您只需通过引用other即可,但不能将其内容复制到MyObject的新实例。所以你的构造函数只会返回一个新的引用到已经存在的实例。你需要的是一个全新的MyObject实例,不是吗?所以你必须使用其构造函数创建一个。如果你有一个拷贝构造函数,达到这个you're罚款:

public class MyObject { 
    public MyObject(MyObject other) { 
     this.Prop1 = other.Prop1; 
    } 
} 

当然也有一些较短的(但不是neccesarily金丹)appraoches - 例如使用反射并简单地将所有属性值从一个实例复制到另一个实例。但基本上,您最终还是会通过适当地设置其成员来创建一个全新的实例。

反射代码可能类似于此:

public class MyObject { 
    public MyObject(MyObject other) { 
     var props = typeof(MyObject).GetProperties(); 
     foreach(var p in props) 
     { 
      p.SetValue(this, p.GetValue(other)); 
     } 
    } 
} 

然而,这仅适用于公共属性,你有领域和私有或内部成员也这样做。

+0

如果我需要一个全新的实例取决于用例,我想。假设我有一个基于强制类型配置模型的配置系统,它正在从底层提供者/序列化器反序列化。然后我希望序列化程序返回的实例实际上是当前实例。然而对于例如DTO/PTO映射等,我期望实例被复制。 – artganify

+0

因此,如果您已经有了对您的实例的引用,并且不想要它的副本,那么为什么不直接使用该引用呢? – HimBromBeere