如何使用 Func<> 更新对象属性?
How to update object properties with Func<>?
Is it somehow possible to update object properties by using
Func
with lambda expression?
富class
public class Foo
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
//... many others
}
实用class
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 = 10
和 Name = "Test"
.
Func<Foo, object>
签名无效。 lambda p => p.Id = 10
不 return object
。
如果你想简单地改变现有的方法来工作,那么这样做:
public Foo FooUpdate(Foo item, params Action<Foo> properties)
{
foreach(var property in properties)
{
property(item);
}
return item
}
但请注意,这是一个非常糟糕的设计。首先,您的方法同时修改了传递的 item
和 returns - 它应该修改它(和 return void
)或将 item
保留为是的,克隆它然后修改并 return 克隆。其次,我认为这个 Util
方法没有任何价值。对它的任何调用都等同于逐行应用更新。
var updatedFoo = Updater.FooUpdate(item, p => p.Id = 10, p => p.Name = "Test", ...);
与
相同
item.Id = 10;
item.Name = "Test";
/* ... */
你不需要在这里使用 Func
因为你不需要 return 任何东西。您可以使用 Action
:
修改 foo
public Foo FooUpdate(Foo item, params Action<Foo>[] propertySetters)
{
foreach(var propertySetter in propertySetters)
{
propertySetter(item);
}
return item;
}
我写了一个小方法,允许通过选择 属性 来更新对象的值。
用法:var result = UpdateByField(company, 1, x => x.Id);
private T UpdateByField<T, TValue>(T obj, TValue value, Expression<Func<T, TValue>> selector)
{
var memberExpression = selector.Body as MemberExpression;
var field = memberExpression.Member as FieldInfo;
var property = memberExpression.Member as PropertyInfo;
if (field != default)
field.SetValue(obj, value);
if (property != default)
property.SetValue(obj, value);
return obj;
}
Is it somehow possible to update object properties by using
Func
with lambda expression?
富class
public class Foo
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
//... many others
}
实用class
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 = 10
和 Name = "Test"
.
Func<Foo, object>
签名无效。 lambda p => p.Id = 10
不 return object
。
如果你想简单地改变现有的方法来工作,那么这样做:
public Foo FooUpdate(Foo item, params Action<Foo> properties)
{
foreach(var property in properties)
{
property(item);
}
return item
}
但请注意,这是一个非常糟糕的设计。首先,您的方法同时修改了传递的 item
和 returns - 它应该修改它(和 return void
)或将 item
保留为是的,克隆它然后修改并 return 克隆。其次,我认为这个 Util
方法没有任何价值。对它的任何调用都等同于逐行应用更新。
var updatedFoo = Updater.FooUpdate(item, p => p.Id = 10, p => p.Name = "Test", ...);
与
相同item.Id = 10;
item.Name = "Test";
/* ... */
你不需要在这里使用 Func
因为你不需要 return 任何东西。您可以使用 Action
:
public Foo FooUpdate(Foo item, params Action<Foo>[] propertySetters)
{
foreach(var propertySetter in propertySetters)
{
propertySetter(item);
}
return item;
}
我写了一个小方法,允许通过选择 属性 来更新对象的值。
用法:var result = UpdateByField(company, 1, x => x.Id);
private T UpdateByField<T, TValue>(T obj, TValue value, Expression<Func<T, TValue>> selector)
{
var memberExpression = selector.Body as MemberExpression;
var field = memberExpression.Member as FieldInfo;
var property = memberExpression.Member as PropertyInfo;
if (field != default)
field.SetValue(obj, value);
if (property != default)
property.SetValue(obj, value);
return obj;
}