这只是一个“出于好奇”的问题,所以我不能提供一个基于当前问题的真实世界的例子,但是一个小的虚拟代码就足够了。我想知道的是,是否有一种直接向前(尤其是快速)的方法将对象的实例映射到“this”(完全相同类型的当前实例,并访问私有成员等)。
public class MyObject {
public MyObject(MyObject other) {
// of course, won't work
this = other;
}
}
我见过的所有例子和方法都过度使用了反射,甚至建立了完整的表达式树,或者使用了类似Automapper这样的框架,所有这些都有自己的局限性,而这个想法看起来“相当微不足道”。为什么不能将所有指针/引用等从内存中的一个位置复制到另一个位置,因为分配的空间等完全相同?
发布于 2016-03-08 02:30:25
AFAIK,对于自己的实例(这个),没有一种直接的方法可以做到这一点。我想,将数据从另一个实例复制到这里就足够了。对于您来说,可能的替代方法是使用静态实例,但如果需要处理多个实例,则有一些特殊性。
public class MyObject {
private static MyObject _instance;
public static MyObject Instance
{
get { return _instance; }
set { _instance = value; }
} }
PS:我从我的手机上写了这篇文章,所以如果你遇到一些小错误,请原谅我,因为我无法在发布之前对它进行测试。一旦我能够测试代码,我就会更新文章。
发布于 2016-03-08 02:20:53
如果可能的话,您只是通过一个新引用引用other
,而不是将其内容复制到MyObject
的一个新实例中。因此,构造函数只需返回对已经存在的实例的新引用。您需要的是一个全新的MyObject
实例,不是吗?所以你必须用它的一个构造函数来创建一个。如果您有一个副本构造函数来实现这一点,那么您就可以了:
public class MyObject {
public MyObject(MyObject other) {
this.Prop1 = other.Prop1;
}
}
当然,还有一些较短的(但不是临时保护程序)应用程序,例如使用反射,简单地将所有属性值从一个实例复制到另一个实例。然而,基本上,您仍然通过适当设置其成员来创建一个全新的实例。
反射代码看起来可能与此类似:
public class MyObject {
public MyObject(MyObject other) {
var props = typeof(MyObject).GetProperties();
foreach(var p in props)
{
p.SetValue(this, p.GetValue(other));
}
}
}
但是,这只适用于公共属性,您必须对字段和私有或内部成员执行此操作。
https://stackoverflow.com/questions/35864569
复制