c# - 使用反射创建 lambda 表达式,如 x => new { .. }

标签 c# reflection lambda expression

我有一个 IQuerable<object> source对象并且必须从中得到类似的东西(但使用反射)。

source.Select(t => new SelectListItem { Name = t.Name, Value = t.Id })

我该怎么做,或者我在哪里可以找到构建这种表达式树的引用。

谢谢

最佳答案

您可以使用 System.Linq.Expressions 命名空间 ( MSDN ) 创建 Expression

在您的情况下,它看起来像这样:

var source = typeof( Source );
var target = typeof( SelectListItem );

var t = Expression.Parameter( source, "t" );

var sourceName = Expression.MakeMemberAccess( t, source.GetProperty( "Name" ) );
var sourceId = Expression.MakeMemberAccess( t, source.GetProperty( "Id" ) );

var assignName = Expression.Bind( target.GetProperty( "Name" ), sourceName );
var assignValue = Expression.Bind( target.GetProperty( "Value" ), sourceId );
var targetNew = Expression.New( target );
var init = Expression.MemberInit( targetNew, assignName, assignValue );

var lambda =
  ( Expression<Func<Source,SelectListItem>> ) Expression.Lambda( init, t );

你可以这样使用它:

IQueryable<Source> list = ...

List<SelectListItem> items = list.Select( lambda ).ToList();

关于c# - 使用反射创建 lambda 表达式,如 x => new { .. },我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14275253/

相关文章:

c# - 检查 T 是否为 IEnumerable

c# - 在 C# 中编写自定义联合(多个对象之间的连接)

Java Reflections - 使用 BigInteger 参数调用方法

java - Java中根据条件访问字段

c++ - 通过 lambda 中的显式 this 参数访问捕获的变量

java - 获取 lambda 类的列表

lambda - 使用函数中的 lambda 值作为列表的第一个元素

c# - 将字节转换为字符串

c# - 在 C# 自定义操作中更改安装程序属性

c# - C# 继承类Stream并且可以序列化的Stream