gpt4 book ai didi

c# - 从字符串构造嵌套属性的 LambdaExpression

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

我正在尝试在运行时根据属性名称为嵌套属性创建 lambda 表达式。基本上我正在尝试创建由以下内容指定的 lambda 表达式:

var expression = CreateExpression<Foo, object>(foo => foo.myBar.name);

private static Expression CreateExpression<TEntity, TReturn>(Expression<Func<TEntity, TReturn>> expression)
{
return (expression as Expression);
}

与类:

class Foo
{
public Bar myBar { get; set; }
}
class Bar
{
public string name { get; set; }
}

然而,我得到的只是 Foo 的类型和字符串 "myBar.name"

如果它是一个普通属性,例如只需要值 "myBar",那么我可以使用以下内容:

private static LambdaExpression GetPropertyAccessLambda(Type type, string propertyName)
{
ParameterExpression odataItParameter = Expression.Parameter(type, "$it");
MemberExpression propertyAccess = Expression.Property(odataItParameter, propertyName);
return Expression.Lambda(propertyAccess, odataItParameter);
}

但是这段代码不适用于嵌套属性,我不确定如何创建 LambdaExpression 来完成 foo.myBar.name 的工作。

我认为它会是这样的:

GetExpression(Expression.Call(GetExpression(Foo, "myBar"), "name"))

但我似乎无法弄清楚如何让它全部工作,或者是否有更好的方法在运行时执行此操作。

最佳答案

你的意思是:

static LambdaExpression CreateExpression(Type type, string propertyName) {
var param = Expression.Parameter(type, "x");
Expression body = param;
foreach (var member in propertyName.Split('.')) {
body = Expression.PropertyOrField(body, member);
}
return Expression.Lambda(body, param);
}

例如:

class Foo {
public Bar myBar { get; set; }
}
class Bar {
public string name { get; set; }
}
static void Main() {
var expression = CreateExpression(typeof(Foo), "myBar.name");
// x => x.myBar.name
}

?

关于c# - 从字符串构造嵌套属性的 LambdaExpression,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16208214/

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