C# 在c中创建带反射的Lambda表达式#
我需要创建以下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
{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"));