我试图在运行时根据属性名称创建一个嵌套属性的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);
}
然而,这段代码不能处理嵌套属性,我不确定如何创建Lambda表达式来完成 foo.myBar.name
的工作。
我认为它应该是这样的:
GetExpression(Expression.Call(GetExpression(Foo, "myBar"), "name"))
但是我似乎无法弄清楚如何使所有东西都运作起来,或者是否有更好的方法在运行时完成这个任务。
Expression.Call
;请参见此处的Expression.Call
: https://sharplab.io/#v2:EYLgxg9gTgpgtADwGwBYA+ABATARgLABQGADAAQY4B0AMgJYB2AjpQKIIAOsAzl7RPVwDchNpxg8+9ADwYArDJzEANKQYAXFWAAWAQygA+faS6kAvKVIAKLitoBKM0a4BtWgF1hBIA== - 请注意,您不需要 LdMemberToken - 但您需要通过反射找到访问器。 - Marc Gravell