我试图在运行时根据属性的名称为嵌套属性创建一个 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"))
但我似乎无法弄清楚如何让它全部工作,或者是否有更好的方法在运行时做到这一点。