目标是从两个 LambdaExpressions 中获取 MemberExpressions 数组。第一个可转换为返回对象实例的 MethodCallExpression ( Expression<Func<T>>
)。第二个 Lambda 表达式将获取已编译的第一个表达式的结果并返回一个嵌套成员 ( Expression<Func<T,TMember>>
)。我们可以假设第二个 Lambda 表达式只会调用嵌套属性,但可能会调用其中的几个。
所以,我试图创建的方法的签名是:
MemberExpression[] GetMemberExpressionArray<T,TValue>(Expression<Func<T>> instanceExpression, Expression<Func<T,TValue>> nestedMemberExpression)
wherenestedMemberExpression
将被假定采用形式的参数
parent => parent.ChildProperty.GrandChildProperty
parent
结果数组表示来自toChildProperty
和来自 to 值ChildProperty
的MemberAccess GrandChildProperty
。
我已经MemberExpression
使用以下扩展方法返回了最后一个。
public static MemberExpression GetMemberExpression<T, TValue>(Expression<Func<T, TValue>> expression)
{
if (expression == null)
{
return null;
}
if (expression.Body is MemberExpression)
{
return (MemberExpression)expression.Body;
}
if (expression.Body is UnaryExpression)
{
var operand = ((UnaryExpression)expression.Body).Operand;
if (operand is MemberExpression)
{
return (MemberExpression)operand;
}
if (operand is MethodCallExpression)
{
return ((MethodCallExpression)operand).Object as MemberExpression;
}
}
return null;
}
现在,我知道有几种方法可以做到这一点。对我来说最直观的方法是遍历.Expression
属性以获取第一个表达式并捕获对每个 MemberExpression 的引用。这可能是最好的方法,但也可能不是。我对使用这样的表达式所带来的性能成本并不是特别熟悉。我知道 MemberExpression 有一个 MemberInfo 并且反射应该会损害性能。
我试图搜索有关表达式的信息,但我的资源在我找到的内容中非常有限。
对于如何以最佳性能和可靠性完成此任务(通常是此类任务)的任何建议,我将不胜感激。