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
或字符串串联。