是否可以通过使用某种方式更新对象属性
  Func带有lambda表达式?




富班


public class Foo
{
    public int Id      { get; set; }
    public string Name { get; set; }
    public int Age     { get; set; }
    //... many others
}


实用类


public static class Updater
{
    public Foo FooUpdate(Foo item, params Func<Foo, object> properties)
    {
        foreach(var property in properties)
        {
            //take value of property and set it on item object
        }
        return item
    }
}


初始通话


   var updatedFoo = Updater.FooUpdate(item, p => p.Id = 10, p => p.Name = "Test", ...);


FooUpdate方法之后,我想接收updatedFoo对象,该对象在给定的调用中具有给定的值参数。 Id = 10Name = "Test"

最佳答案

Func<Foo, object>签名无效。 Lambda p => p.Id = 10不返回object
如果您只想更改现有方法即可使用,则可以这样做:

 public Foo FooUpdate(Foo item, params Action<Foo> properties)
 {
     foreach(var property in properties)
     {
        property(item);
     }
     return item
 }


但是请注意,这是一个非常糟糕的设计。首先,您的方法会修改传递的item并返回它-它应该对其进行修改(并返回void)或保留item不变,对其进行克隆,然后修改并返回该克隆。其次,在此Util方法中我看不到任何价值。对其的任何调用都等同于仅逐行应用更新。

var updatedFoo = Updater.FooUpdate(item, p => p.Id = 10, p => p.Name = "Test", ...);


是相同的

item.Id = 10;
item.Name = "Test";
/* ... */

09-10 12:57
查看更多