如何自动更新对象引用

时间:2018-06-10 17:35:35

标签: c# .net

给出这个示例代码:

MyTable myTable = new MyTable();
MyTableClient1 foo= new MyTableClient1(myTable);
MyTableClient2 bar= new MyTableClient2(myTable);
MyTableClient3 baz= new MyTableClient3(myTable);
... and so on

因此,您可以看到我创建了一个MyTable实例,并将其传递给内部存储它的其他对象,他们使用它并且可能将它传递给其他对象。

因此,对myTable的引用遍及我的运行时环境中的许多对象

现在出现问题:我必须更新myTable,但我有一个方法可以为我提供一个新的更新的MyTable对象。请检查以下内容:

myTable= MyTableProvider.getUpdated(myTable);

对于cource来说这个语句没用,因为foo,bar等内部对myTable的所有引用仍然与旧的MyTable对象绑定...

我需要一种方法告诉c#:“所有对此对象的现有引用都必须更新到另一个对象!”

有办法做到这一点吗?我无法想到手动替换foo,bar,baz等中的对象。

2 个答案:

答案 0 :(得分:1)

方法1: 一种方法是使用包装类:

class TableWrapper {
        public TableWrapper(MyTable table) {this.Table = table}
        public MyTable Table {get; set;}
}

然后你的代码将是:

MyTable myTable = new MyTable();
TableWrapper wrapped = new TableWrapper(myTable)
MyTableClient1 foo= new MyTableClient1(wrapped);
MyTableClient2 bar= new MyTableClient2(wrapped);

wrapped.Table= MyTableProvider.getUpdated(myTable);

这样,您的客户端收到包装对象并使用arg.Table而不仅仅是arg;然后修改wrapped的属性,现在客户端已更新。

方法2:编辑:以下不起作用,因为refs无法存储为对象属性。不删除以进行存档。 使用C#"参考"关键字。

修改MyTableClient的构造函数以接受ref MyTable而不仅仅是MyTable。然后通过执行

传递表
MyTable myTable = new MyTable();
MyTableClient1 foo= new MyTableClient1(ref myTable);
MyTableClient2 bar= new MyTableClient2(ref myTable);

只要MyTableClient不复制数据但使用原始引用,将myTable更改为更新的表将导致更改反映在表客户端中。

答案 1 :(得分:0)

您可以使用完整的属性。

    MyTableClient1 foo;
    MyTableClient2 bar;
    MyTableClient3 baz;

    private MyTable _myTable;
    public MyTable myTable
    {
        get { return _myTable; }
        set 
            { 
                foo = new MyTableClient1(value);
                bar = new MyTableClient2(value);
                baz = new MyTableClient3(value);

                _myTable = value;  
            }
    }