C# 在c中创建带反射的Lambda表达式#

C# 在c中创建带反射的Lambda表达式#,c#,reflection,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 = Expr

我需要创建以下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; }
    }

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

var outerMemberExpression = Expression.Property(memberExpression, typeof(U).GetProperty("NameEn"));
并将其用于lambda表达式。毕竟,这里有两个成员访问表达式:一个用于访问
Name
,另一个用于访问
NameEn
,您可以尝试:

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"));