gpt4 book ai didi

c# - 属性选择器 Expression>。如何获取/设置所选属性的值

转载 作者:IT王子 更新时间:2023-10-29 03:44:27 27 4
gpt4 key购买 nike

我有一个对象,我想以这种方式构建:

var foo = new FancyObject(customer, c=>c.Email); //customer has Email property

我应该如何声明第二个参数?

访问选定属性 setter/getter 的代码会是什么样子?

更新。模型中有多个实体具有 Email 属性。所以签名可能看起来像:

public FancyObject(Entity holder, Expression<Func<T>> selector)

和构造函数调用

var foo = new FancyObject(customer, ()=>customer.Email);

最佳答案

参数将是 Expression<Func<Customer,string>> selector .可以通过平面编译读取它:

 Func<Customer,string> func = selector.Compile();

然后你可以访问func(customer) .分配比较棘手;对于简单的选择器,您可能希望可以简单地分解为:

var prop = (PropertyInfo)((MemberExpression)selector.Body).Member;
prop.SetValue(customer, newValue, null);

但是更复杂的表达式要么需要手动树遍历,要么需要一些 4.0 表达式节点类型:

        Expression<Func<Customer, string>> email
= cust => cust.Email;

var newValue = Expression.Parameter(email.Body.Type);
var assign = Expression.Lambda<Action<Customer, string>>(
Expression.Assign(email.Body, newValue),
email.Parameters[0], newValue);

var getter = email.Compile();
var setter = assign.Compile();

关于c# - 属性选择器 Expression<Func<T>>。如何获取/设置所选属性的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5075484/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com