C# 为POCO属性生成属性选择器表达式

C# 为POCO属性生成属性选择器表达式,c#,reflection,C#,Reflection,我有一门课: 公共类用户 { 公共字符串名称{get;set;} 公共整数{get;set;} } 现在我想生成一个列表: List selectoreexpressions=/**/ 该列表应该包含与此示例匹配的每个属性的选择器表达式: user=>user.Name; user=>user.Age; /*等等*/ 最简单的方法是什么 编辑:澄清一下:我想为类中的每个属性生成此列表,例如: List selectorExpressions=Util.GetSelectorsForEver

我有一门课:

公共类用户
{
公共字符串名称{get;set;}
公共整数{get;set;}
}
现在我想生成一个列表:

List selectoreexpressions=/**/
该列表应该包含与此示例匹配的每个属性的选择器表达式:

user=>user.Name;
user=>user.Age;
/*等等*/
最简单的方法是什么

编辑:澄清一下:我想为类中的每个属性生成此列表,例如:

List selectorExpressions=Util.GetSelectorsForEveryProperty();

我不想为我需要的每个属性手动编写lambda。

您可以通过反射和动态表达式创建来完成:

var selectorExpressions = new List<Expression<Func<User, object>>>();

foreach (var prop in typeof(User).GetProperties())
{
    var arg = Expression.Parameter(typeof(User), "x");
    var property = Expression.Property(arg, prop.Name);
    var cast = Expression.Convert(property, typeof(object));
    var expr = Expression.Lambda<Func<User, object>>(cast, arg);                
    selectorExpressions.Add(expr);
}   
var selectorExpressions=new List();
foreach(typeof(User.GetProperties()中的var prop)
{
var arg=Expression.Parameter(typeof(User),“x”);
var property=Expression.property(arg,prop.Name);
var cast=Expression.Convert(属性,typeof(对象));
var expr=Expression.Lambda(cast,arg);
选择或表达式。添加(expr);
}   

您可以通过反射和动态表达式创建来实现:

var selectorExpressions = new List<Expression<Func<User, object>>>();

foreach (var prop in typeof(User).GetProperties())
{
    var arg = Expression.Parameter(typeof(User), "x");
    var property = Expression.Property(arg, prop.Name);
    var cast = Expression.Convert(property, typeof(object));
    var expr = Expression.Lambda<Func<User, object>>(cast, arg);                
    selectorExpressions.Add(expr);
}   
var selectorExpressions=new List();
foreach(typeof(User.GetProperties()中的var prop)
{
var arg=Expression.Parameter(typeof(User),“x”);
var property=Expression.property(arg,prop.Name);
var cast=Expression.Convert(属性,typeof(对象));
var expr=Expression.Lambda(cast,arg);
选择或表达式。添加(expr);
}   

选择或表达式。添加(user=>user.Name)
。您不需要对此进行反射。@PanagiotisKanavos我不想手动编写lambdas,我想为类中的每个属性生成表达式,请参见编辑后的答案。Merhat发布了如何做到这一点,但您为什么要这样做?这听起来类似于eg Automapper或序列化程序所需要的。可能已经有了解决办法。在试图使事物变得“灵活”的同时过于元化会产生相反的结果。您是否尝试创建一个访问属性的表达式?完成此操作后,在所有属性的循环中执行此操作。你能告诉我们到目前为止你都尝试了什么吗?@mrpyo我需要知道,因为我在商业ASP.NET MVC库(如Kendo UI)中见过这样的代码。SPA不会有帮助——无论您使用jquery、fetch还是任何其他技术,最终您都会向控制器操作发送一个
query
对象,其中包含实体名称、字段、排序顺序、分页信息。从中,库的映射代码将生成一个LINQ查询。
selectorExpressions.Add(user=>user.Name)
。您不需要对此进行反射。@PanagiotisKanavos我不想手动编写lambdas,我想为类中的每个属性生成表达式,请参见编辑后的答案。Merhat发布了如何做到这一点,但您为什么要这样做?这听起来类似于eg Automapper或序列化程序所需要的。可能已经有了解决办法。在试图使事物变得“灵活”的同时过于元化会产生相反的结果。您是否尝试创建一个访问属性的表达式?完成此操作后,在所有属性的循环中执行此操作。你能告诉我们到目前为止你都尝试了什么吗?@mrpyo我需要知道,因为我在商业ASP.NET MVC库(如Kendo UI)中见过这样的代码。SPA不会有帮助——无论您使用jquery、fetch还是任何其他技术,最终您都会向控制器操作发送一个
query
对象,其中包含实体名称、字段、排序顺序、分页信息。从中,库的映射代码将生成一个LINQ查询。