C# 展平Lambda表达式以访问集合属性成员名称

C# 展平Lambda表达式以访问集合属性成员名称,c#,lambda,C#,Lambda,给定以下类 public class Person { public string Name { get; } public List<Person> Friends { get; } } 公共类人物 { 公共字符串名称{get;} 公开列表好友{get;} } 我正在寻找一种在使用表达式>时获取以下字符串“Friends.Name”的方法 下面是我要做的工作的伪代码: Expression<Func<Person,string>> exp

给定以下类

public class Person
{
    public string Name { get; }
    public List<Person> Friends { get; }
}
公共类人物
{
公共字符串名称{get;}
公开列表好友{get;}
}
我正在寻找一种在使用表达式>时获取以下字符串“Friends.Name”的方法

下面是我要做的工作的伪代码:

Expression<Func<Person,string>> exp = x => x.Friends.Name
exp=x=>x.Friends.Name 由于明显的原因,它不会编译

我怎样才能做到这一点?即使你没有代码,一个通用的方法也可以做到,因为我在这方面缺乏灵感


谢谢

假设使用下面的表达式,您可以得到如下路径:

Expression<Func<Person, string>> exp = x => x.Name; 

var lambdaBody = exp.Body;

if(lambdaBody.NodeType == ExpressionType.MemberAccess)
{
    var memberExpression = lambdaBody as MemberExpression;
    Console.WriteLine(memberExpression.ToString());
}
_ => _.Friends.Select(f => f.Children.Select(c => c.Age))

使用这种类型的表达式无法获得所需的内容:

表达式

因为
有一群
朋友
。实际上,
Func
的返回类型在这里并不重要。这将有助于:

    static string GetPath(Expression<Func<Person, object>> expr)
    {
        var selectMethodCall = (MethodCallExpression)expr.Body;
        var collectionProperty = (MemberExpression)selectMethodCall.Arguments[0];
        var collectionItemSelector = (LambdaExpression)selectMethodCall.Arguments[1];
        var collectionItemProperty = (MemberExpression)collectionItemSelector.Body;

        return $"{collectionProperty.Member.Name}.{collectionItemProperty.Member.Name}";
    }
但这是一个相当简单的案例,而在我看来,您正在执行类似于实体框架中的
Include
方法的操作。
因此,如果您想解析更复杂的表达式,如下所示:

Expression<Func<Person, string>> exp = x => x.Name; 

var lambdaBody = exp.Body;

if(lambdaBody.NodeType == ExpressionType.MemberAccess)
{
    var memberExpression = lambdaBody as MemberExpression;
    Console.WriteLine(memberExpression.ToString());
}
_ => _.Friends.Select(f => f.Children.Select(c => c.Age))

您需要以更通用的方式探索该表达式。

这是什么意思
获取以下字符串“Friends.Name”
@FarhadJabiyev感谢您的关注,这意味着我想知道此属性的“路径”,以及您想如何使用该路径?我只需要路径;)我将它用于一个奇特的序列化/反序列化场景,与一些数据库管理员交谈。这不是一个“相当简单的案例”,这是完美的!!谢谢你,这正是我需要的。我正要建造更复杂的东西。谢谢你的编辑,我明白你说的复杂情况是什么意思了,谢谢为什么代码不编译?(它表示在
返回$“{collectionProperty.Member.Name}.{collectionItemProperty.Member.Name}”时出错);
某些reason@Fabjan:这是C#6功能()。要编译VS2013及以下版本的代码,请将此行替换为
string.Format
或字符串串联。