假设我有一些具有大量冗余属性的类,我想将它们存储在列表,字典或其他内容中
public class Foo
{
public Bar Bar1 {get;set;}
public Bar Bar2 {get;set;}
public Bar Bar3 {get;set;}
public Buzz Buzz1 {get;set;}
public Buzz Buzz2 {get;set;}
public Buzz Buzz3 {get;set;}
public void UpdateObject(Buzz newValue)
{
var dict = new List<KeyValuePair<Bar, Func<Buzz >>>()
{
new KeyValuePair<Bar, Func<Buzz>>(this.Bar1 ,()=>this.Buzz1),
new KeyValuePair<Bar, Func<Buzz>>(this.Bar2 ,() => this.Buzz2 ),
new KeyValuePair<Bar, Func<Buzz>>(this.Bar3 ,() => this.Buzz3 )
};
foreach (var item in dict)
{
if (true)
{
var value = item.Value.Invoke();
value = newValue;
}
}
}
}
当然value
已更改,但Foo的Buzz1 / 2/3属性未更改。如何在列表中存储对象属性的某种引用,获取此项并更改对象的值?
答案 0 :(得分:2)
代替键和值设置器的键值对,存储键,getter和setter:
List<Tuple<Bar, Func<Buzz>, Action<Buzz>>
Action<Buzz>
是一个lambda,它将Buzz
的新值作为参数。
var dict = new List<Tuple<Bar, Func<Buzz>, Action<Buzz>>
{
new Tuple<Bar, Func<Buzz>, Action<Buzz>(this.Bar1 ,()=>this.Buzz1, x => this.Buzz1 = x),
// ...etc...
};
不确定你为什么这样做,但那会奏效。
如果是我,而不是Tuple
或 KeyValuePair
,我会编写一个ThingReference<T>
类来获取两个lambdas,并存储这些在Dictionary<Bar, ThingReference<Buzz>>
中。