是否可以从Action<T>中提取属性和值?

问题描述 投票:0回答:1

首先,我定义了一个类,例如:

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 表达式无法转换为表达式树

c# expression
1个回答
0
投票

表达式树可能不包含赋值运算符,但您可以使用

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",
});

因为这是读取表达式,所以不需要实际分配这个对象。

© www.soinside.com 2019 - 2024. All rights reserved.