这是一个非常复杂的问题,尽管看起来很简单。我想我必须遍历整个表达式树,除非有人知道更好的方法。
假设我有一个用户对象
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(使用前将#替换为@)