用c#中的反射创建Lambda表达式

时间:2016-02-18 06:22:20

标签: c# reflection

我需要创建以下Lambda表达式:

{d=>d.Name.NameEn}

我写了以下代码:

ParameterExpression parameter = Expression.Parameter(typeof(T), "d");
MemberExpression memberExpression = Expression.Property(parameter, typeof(T).GetProperty("Name"));
LambdaExpression lambda = Expression.Lambda(memberExpression, parameter);

输出:

{d => d.Name}

但我需要这个:

{d=>d.Name.NameEn}

如何制作?

更新

我的班级:

 public class T
    {
        public U Name { get; set; }
    }
    public class U
    {
        public string NameEn { get; set; }
    }

2 个答案:

答案 0 :(得分:0)

在这种情况下,您需要将表达式包装在另一个MemberExpression中,例如:

var outerMemberExpression = Expression.Property(memberExpression, typeof(U).GetProperty("NameEn"));

并将其用于lambda表达式。毕竟,你有两个成员访问表达式:一个用于访问Name,另一个用于访问NameEn

答案 1 :(得分:0)

您可以尝试:

ParameterExpression parameter = Expression.Parameter(typeof(T), "d");
MemberExpression memberExpression = 
    Expression.Property(parameter, typeof(T).GetProperty("Name"));
MemberExpression memberExpressionInner = 
    Expression.Property(memberExpression,
                        typeof(T).GetProperty("Name").PropertyType.GetProperty("NameEn"));
LambdaExpression lambda = Expression.Lambda(memberExpressionInner, parameter);

或者,如果在运行时已知U(我在更新之前假设T将是一个通用参数),则第三行可能是:

MemberExpression memberExpressionInner = 
    Expression.Property(memberExpression, typeof(U).GetProperty("NameEn"));