将对象实例映射到'this'?

时间:2016-03-08 10:15:03

标签: c# .net object reflection reference

这只是一个“过度好奇”的问题,所以我不能提供基于当前问题的真实世界示例,但是一些虚拟代码就足够了。我想知道的是,是否有一种直接(特别快)的方法将对象的实例映射到'this'(完全相同类型的当前实例,可以访问私有成员等)。 p>

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

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

2 个答案:

答案 0 :(得分:1)

如果可行,您只需通过新引用引用other,但不要将其内容复制到MyObject的新实例。因此,构造函数只会返回对现有实例的新引用。您需要的是MyObject的全新实例,不是吗?所以你必须使用它的一个构造函数创建一个。如果你有一个复制构造函数来实现这一点你很好:

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

当然有一些较短的(但不是必需的保护程序)appraoches - 例如使用反射并简单地将所有属性值从一个实例复制到另一个实例。但是,基本上你仍然可以通过适当地设置其成员来创建一个全新的实例。

反射代码可能与此类似:

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

但是,这仅适用于公共属性,您必须对字段以及私有或内部成员执行此操作。

答案 1 :(得分:1)

AFAIK,对于自己的实例(这个),没有直接的方法。我想,将数据从另一个实例复制到此就足够了。对于您来说可能是另一种选择是使用静态实例,但如果您需要使用多个实例,这有一些特殊性。

public class MyObject {


    private static MyObject _instance;

    public static MyObject Instance 
    {
        get { return _instance; }
        set { _instance  = value; }
    } }
PS:我是从我的手机上写过这篇文章的,所以请原谅我,如果你遇到小错误,因为我在发布之前无法测试它。我会在我能够测试代码后立即更新帖子。