gpt4 book ai didi

c# - 如何让 Expression.PropertyOrField 为 child 工作?

转载 作者:行者123 更新时间:2023-12-02 20:48:09 25 4
gpt4 key购买 nike

我一整天都在使用 Expression,我的代码通常可以执行 c => c.Name 之类的操作,例如,它终于可以工作了。用户可以指定一个属性,例如"Name" 作为一个字符串,我使用这个:

var selectorParameter = Expression.Parameter(typeof(T), "c");
var selector = Expression.PropertyOrField(selectorParameter, memberName);

得到它。

但是我刚刚发现,在某些情况下,我不仅需要做 c.Name,还需要做类似 c.Address.AddressLine1 的事情,其中​​ memberName 是 "Address .AddressLine1"。后者不起作用。

有没有一种方法可以处理这些带有子项作为选择器一部分的嵌套实例?

最佳答案

你可以自己分解,像这样:

var selectorParameter = Expression.Parameter(typeof(T), "c");
MemberExpression selector = null;
// first part goes to parameter - "x.Parameter"
Expression current = selectorParameter;
foreach (var part in memberName.Split('.')) {
selector = Expression.PropertyOrField(current, part);
// subsequent parts go to selector itself: "x.Parameter.AnotherParameter"
current = selector;
}

如果你想确保所有这些属性确实存在,你可以这样做:

var selectorParameter = Expression.Parameter(typeof(T), "c");
MemberExpression selector = null;
Expression current = selectorParameter;
Type currentType = typeof(T);
foreach (var part in memberName.Split('.')) {
var prop = currentType.GetProperty(part, BindingFlags.Instance | BindingFlags.Public);
if (prop == null) {
// do something
}
selector = Expression.Property(current, prop);
current = selector;
currentType = prop.PropertyType;
}

关于c# - 如何让 Expression.PropertyOrField 为 child 工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43371539/

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