首先,我定义了一个类,例如:
class UserInfo
{
public string UserName { get; set; }
public int Age { get; set; }
public bool State { get; set; }
public void eat()
{
}
}
然后,在类
Program
中,定义了一个方法Update2
:
private void Update2<T>(Action<T> exp)
{
}
方法
Update2
可以这样调用:
Update2<UserInfo>(u => {
u.Age = 120;
u.State = false;
u.UserName = "what's name";
});
是否可以知道更新后的属性和值? 或者,我可以用一个表达式来知道吗?
更新
private void Update1<T>(Expression<Action<T>> exp)
{
}
如果使用
Update1
方法,你只能称之为喜欢Update1<UserInfo>(u => u.eat());
。如果你使用
Update1<UserInfo>(u => {
u.Age = 123;
u.State = false
});
将会出现错误:错误(活动)CS0834 带有语句主体的 lambda 表达式无法转换为表达式树
表达式树可能不包含赋值运算符,但您可以使用
Expression<Func<T>>
而不是 Action<T>
来读取 MemberInitExpression:
private void Update1<T>(Expression<Func<T>> exp)
{
if (exp.Body is MemberInitExpression exp2)
{
foreach (var b in exp2.Bindings)
{
if (b is MemberAssignment ma)
{
// left property
Console.WriteLine(ma.Member);
// right expression
Console.WriteLine(ma.Expression);
}
}
}
}
Update1(() => new UserInfo
{
Age = 120,
State = false,
UserName = "what's name",
});
因为这是读取表达式,所以不需要实际分配这个对象。