在一个对象中,有没有办法让它“替换”另一个对象?

时间:2015-01-30 17:40:03

标签: c#

我不确定这是可能的,但如果是的话,我会喜欢它。我有一个类的实例(即一个对象)a1,我希望能够在该对象中调用一个方法,该方法建议用另一个对象a2替换它自己。我真的希望原始对象(a1)为a2,这样如果您在a1.GetHashCode()内调用Main(),它将与a2相同的哈希码

例如:

class Program
{
    static MyObject a2 = new MyObject(1000);

    static void Main(string[] args)
    {
        MyObject a1 = new MyObject(1);      // Create an Object
        a1.ReplaceMe(ref a2);               // Try to replace it

        Console.WriteLine("X = " + a1.x);
        Console.ReadLine();
    }
}

class MyObject
{
    public int x;

    public MyObject(int x)
    {
        this.x = x;
    }

    public void ReplaceMe(ref MyObject somethingElse)
    {
        this = somethingElse;   // REPLACE ITSELF?  (not allowed)
        return;                 // GAURANTEED TO DIRECTLY RETURN
    }
}

但显然不允许this = somethingElse;,因为this是只读的。我明白为什么不允许(谁知道执行是否完成),但我可以保证你立即回来。

有什么方法吗?


修改:有关我为什么要通过示例寻找此类设计的更多背景信息。这是总体目标。想象一个平台解析人们的数据,当它找到一个人的信息时,它会创建一个Person的实例与该信息。你可以得到一个像这样的人:

Person person1 = platform.GetPerson(based_on_data);

现在,想象一下这个平台有两个Person的实例,它认为是不同的人,但突然发现的信息强烈暗示这两个实例实际上是指同一个人。因此,平台希望将实例合并到一个新对象中,让我们将其称为personX

现在,在平台上漂浮的人有一个合并的两个实例之一的副本,即person1。我想要做的是使用person1即时替换personX。从字面上看,我希望person1==personX是真的,而不仅仅是它们是具有相同数据的两个不同对象。

由于我无法使用person1动态替换personX我有这样的想法,即我无法直接访问Person,而是我可以访问PersonPtr平台(即时)可以更改它所指向的Person

2 个答案:

答案 0 :(得分:1)

通过“替换”另一个实例,您基本上希望能够做的是为包含该实例的变量分配不同的值。一种方法可能如下:

class Program
{
    static void Main(string[] args)
    {
        MyObject a1 = null, a2 = null;

        MyObject.Create(i => a1 = i);
        MyObject.Create(i => a2 = i);

        Console.WriteLine("a1 hashcode:" + a1.GetHashCode()); // 46104728
        Console.WriteLine("a2 hashcode:" + a2.GetHashCode()); // 12289376

        a1.SwapWith(a2);

        Console.WriteLine("a1 hashcode:" + a1.GetHashCode()); // 12289376
        Console.WriteLine("a2 hashcode:" + a2.GetHashCode()); // 46104728
    }
}

class MyObject
{
    private Action<MyObject> _assigner;
    private MyObject() { }
    public static void Create(Action<MyObject> assigner = null)
    {
        var newInstance = new MyObject();
        newInstance._assigner = assigner;

        newInstance.Assign();
    }

    public void SwapWith(MyObject replacement)
    {
        replacement._assigner = Interlocked.Exchange(ref this._assigner, replacement._assigner);

        this.Assign();
        replacement.Assign();
    }

    private void Assign()
    {
        if (_assigner != null) _assigner(this);
    }
}

答案 1 :(得分:-1)

我认为不可能;为什么不使用ref Object A和ref Object B作为参数来创建一个静态方法(在MyObject类之外)?

static void replace(ref object a,ref object b)
{
a = b;
}

工作代码:

class Program
{
    static void replace(ref ObjectA a, ref ObjectA b) {
        a = b;
    }
    static void Main(string[] args)
    {
        ObjectA a = new ObjectA();
        ObjectA b = new ObjectA();
        Console.Write("a: " + a.GetHashCode() + "\n");
        Console.Write("b: " + b.GetHashCode() + "\n");
        Console.Read();
        replace(ref a, ref b);
        Console.Write("a: " + a.GetHashCode() + "\n");
        Console.Write("b: " + b.GetHashCode() + "\n");
        Console.Read();

    }
}
class ObjectA
{
}