将对象分配给变量内的引用,而不是变量

时间:2015-07-29 21:14:01

标签: c# oop

基本上,我得到一个对象的字段的引用,该对象存储在数组中并将其放入变量中。

然后,我想通过将它分配给我之前存储在该字段中的变量,为字段分配不同的对象引用。

为了说明我的观点,这是一个简单的例子:

    class myClass
    {
        public object obj = null;
    }

    class someOtherClass
    {  }

...

    static void Main(string[] args)
    {
        myClass[] arr = new myClass[] { new myClass() };
        var objVar = arr[0].obj;
        objVar = new someOtherClass();
    }

我从数组中的对象获取字段并将其存储在变量中。

现在,我想通过分配变量来在字段中存储新值。

实际发生的事情是变量不保留对字段的引用,而只是将someOtherClass的对象分配给变量,从变量中删除字段。

执行此代码后,obj实例的字段myClass仍为空,而变量objVar包含对someOtherClass实例的引用。

有一种简单的方法可以在这样的变量中为引用分配引用吗?

3 个答案:

答案 0 :(得分:3)

你可以使用lambda表达式的技巧:

var setter = x => arr[0].obj = x;
setter(new someOtherClass());

你甚至可以使用通用的包装类,如下所示:

class Reference<T> {

    private Action<T> setter;
    private Func<T> getter;

    public Reference(Action<T> setter, Func<T> getter) {
        this.setter = setter;
        this.getter = getter;
    }

    public T Value {
        get {
            return getter();
        }
        set {
            setter(value);
        }
    }
}

然后:

var objVar = new Reference<object>(t => arr[0].obj = t, () => arr[0].obj);
objVar.Value = new someOtherClass();

请参阅此处的小提琴:https://dotnetfiddle.net/HXJJQf

答案 1 :(得分:2)

我看到了这些可能性:

  1. 存储索引:

    int i = 0;
    arr[i].obj new someOtherClass();
    
  2. 存储要更改其属性的对象

    var objVar = arr[0]; // NOT arr[0].obj !
    objVar.obj = new someOtherClass();
    
  3. 如果您想动态选择属性,即属性并不总是相同,请使用@ Blorgbeard的答案。

答案 2 :(得分:0)

我认为您需要复制该值,实现以下内容:Deep cloning objects