基本上,我得到一个对象的字段的引用,该对象存储在数组中并将其放入变量中。
然后,我想通过将它分配给我之前存储在该字段中的变量,为字段分配不同的对象引用。
为了说明我的观点,这是一个简单的例子:
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
实例的引用。
有一种简单的方法可以在这样的变量中为引用分配引用吗?
答案 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)
我看到了这些可能性:
存储索引:
int i = 0;
arr[i].obj new someOtherClass();
存储要更改其属性的对象
var objVar = arr[0]; // NOT arr[0].obj !
objVar.obj = new someOtherClass();
如果您想动态选择属性,即属性并不总是相同,请使用@ Blorgbeard的答案。
答案 2 :(得分:0)
我认为您需要复制该值,实现以下内容:Deep cloning objects