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查询。