如何在表达式树中编写 new List<CustomClass>()?
How to write new List<CustomClass>() in Expression Tree?
我想知道我们如何在表达式树中表示下面的 c# 代码。
var list = new List<CustomClass>();
list.add(new CustomClass());
其中 CustomClass 是某种复杂类型 class。
就像如何使用 Expression.NewArrayInit
初始化数组一样
谢谢
你问的代码是这样的:
// List<CustomClass> foo;
var listV = Expression.Variable(typeof(List<CustomClass>), "foo");
// new List<CustomClass>()
var newL = Expression.New(typeof(List<CustomClass>));
// foo = new List<CustomClass>()
var assV = Expression.Assign(listV, newL);
// new CustomClass()
var newEl = Expression.New(typeof(CustomClass));
// foo.Add(new CustomClass())
var addEl = Expression.Call(listV, "Add", null, newEl);
var be = Expression.Block(new[] { listV }, assV, addEl);
请注意,我给你的是一个块表达式...你可以将它放在一个更大的表达式中(或基于它创建一个 lambda),但它不能直接运行(因为它不是一个lambda 表达式)
lambda 表达式示例:
var be = Expression.Block(new[] { listV }, assV, addEl, listV);
var lambda = Expression.Lambda<Func<List<CustomClass>>>(be);
var func = lambda.Compile();
List<CustomClass> res = func();
(请注意,我正在更改 be
变量)
与其使用两个单独的语句,不如使用集合初始值设定项。那时,您可以让编译器为您构建表达式树,因为它是单个表达式:
Expression<Func<List<CustomClass>>> expr =
() => new List<CustomClass> { new CustomClass() };
使用表达式树的工具(例如 LINQ 提供程序)也更有可能理解树。
生成的树使用 Expression.ListInitExpression
作为 Expression.NewArrayInit
的等价列表排序。
手动编写等效代码有些痛苦,但如果确实需要,您可以反编译编译器对该 lambda 表达式的处理。
我想知道我们如何在表达式树中表示下面的 c# 代码。
var list = new List<CustomClass>();
list.add(new CustomClass());
其中 CustomClass 是某种复杂类型 class。
就像如何使用 Expression.NewArrayInit
初始化数组一样谢谢
你问的代码是这样的:
// List<CustomClass> foo;
var listV = Expression.Variable(typeof(List<CustomClass>), "foo");
// new List<CustomClass>()
var newL = Expression.New(typeof(List<CustomClass>));
// foo = new List<CustomClass>()
var assV = Expression.Assign(listV, newL);
// new CustomClass()
var newEl = Expression.New(typeof(CustomClass));
// foo.Add(new CustomClass())
var addEl = Expression.Call(listV, "Add", null, newEl);
var be = Expression.Block(new[] { listV }, assV, addEl);
请注意,我给你的是一个块表达式...你可以将它放在一个更大的表达式中(或基于它创建一个 lambda),但它不能直接运行(因为它不是一个lambda 表达式)
lambda 表达式示例:
var be = Expression.Block(new[] { listV }, assV, addEl, listV);
var lambda = Expression.Lambda<Func<List<CustomClass>>>(be);
var func = lambda.Compile();
List<CustomClass> res = func();
(请注意,我正在更改 be
变量)
与其使用两个单独的语句,不如使用集合初始值设定项。那时,您可以让编译器为您构建表达式树,因为它是单个表达式:
Expression<Func<List<CustomClass>>> expr =
() => new List<CustomClass> { new CustomClass() };
使用表达式树的工具(例如 LINQ 提供程序)也更有可能理解树。
生成的树使用 Expression.ListInitExpression
作为 Expression.NewArrayInit
的等价列表排序。
手动编写等效代码有些痛苦,但如果确实需要,您可以反编译编译器对该 lambda 表达式的处理。