遍历 Linq 表达式以设置属性字段的值

2024-03-16

这是一个非常复杂的问题,尽管看起来很简单。我想我必须遍历整个表达式树,除非有人知道更好的方法。

假设我有一个用户对象

class User
{
    public UserAccount Account {get;set;}
}
class UserAccount
{
    public Name {get;set;}
}
var user = new User() { Account = new UserAccount()};

如何使用 linq 表达式来设置 Name 的属性

SetValue(c => c.Account.Name, "Test");

好吧,您不仅需要遍历表达式树:您还必须将遇到的最终属性“getter”转换为属性“setter”。本质上,您需要找到充当 getter(即它将获取其属性的对象)“目标”的表达式,对其求值以获取目标,然后找到最终属性的相应 setter,然后用目标和新值来调用它。

请注意,仅需要表达式树来表示“getter”,您就会失去一些您可能期望的编译时安全性......因为调用者可以传入只读属性:

SetValue(c => c.Account.Name.Length, 0); // string.Length is read-only

另一种选择是更改代码,使 lambda 表达式代表 setter:

SetValue((c, value) => c.Account.Name = value, "Test");

那么您甚至不需要表达式树 - 您可以使用一个简单的委托,然后适当地执行它。

不幸的是,您并没有真正向我们提供足够的信息来了解您想要实现的目标,以了解这是否是一个可行的建议。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

遍历 Linq 表达式以设置属性字段的值 的相关文章

随机推荐