在将列表存储到列表中时更改对象属性

时间:2016-11-03 20:32:45

标签: c#

假设我有一些具有大量冗余属性的类,我想将它们存储在列表,字典或其他内容中

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属性未更改。如何在列表中存储对象属性的某种引用,获取此项并更改对象的值?

1 个答案:

答案 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>>中。